То, что я хотел бы сделать, это разделить /{id}
на свою собственную таблицу маршрутизации, поэтому, если она не указана, я могу установить идентификатор по умолчанию и использовать ту же таблицу маршрутизации.
index.php:
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
$routes = new RouteCollection();
$routes->add('month_view', new Route('/{id}/month/{year}/{month}',
array('_controller' => function(Request $request) {
$id = $request->get('id'
$year = $request->get('year');
$month = $request->get('month');
return MonthController::showAction($id, $year, $month);
})));
$routes->add('day_view', new Route('/{id}/day/{year}/{month}/{day}',
array('_controller' => function(Request $request) {
$id = $request->get('id');
$year = $request->get('year');
$month = $request->get('month');
$day = $request->get('day');
return DayController::showAction($id, $year, $month, $day);
})));
$framework = new Framework($routes);
$framework->handle(Request::createFromGlobals())->send();
Framework.php:
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\HttpKernel;
use Symfony\Component\EventDispatcher\EventDispatcher;
class Framework extends HttpKernel\HttpKernel
{
public function __construct($routes)
{
$context = new RequestContext();
$matcher = new UrlMatcher($routes, $context);
$resolver = new HttpKernel\Controller\ControllerResolver();
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new HttpKernel\EventListener\RouterListener($matcher));
$dispatcher->addSubscriber(new HttpKernel\EventListener\ResponseListener('UTF-8'));
parent::__construct($dispatcher, $resolver);
}
}
Это для проекта, который использует компоненты Symfony2, но не всю инфраструктуру Symfony2.
Возможно, вы захотите рассмотреть 3 варианта:
1.
Самое простое решение - использовать ключевое слово в качестве идентификатора, так что URL-адрес может выглядеть как /default/month/2015/12
showAction
тогда вы узнаете, что $id == 'default'
в вашем showAction
и использовать некоторый идентификатор по умолчанию для отображения данные
2.
То же, что и 1. но вместо того, чтобы проверять, действительно ли $id == 'default'
в вашем showAction
, вы создадите showDefaultAction
для URL /month/{year}/{month}
(без id-параметра)
3.
снова на основе 1. но вы бы добавили 2 маршрута: /{id}/month/{year}/{month}
, для чего $ id должен быть целым числом, другой должен ожидать строку (опция "по умолчанию"), вы могли бы привести их к двум различным действиям (show/showDefault)