Многоэтапная маршрутизация в клиентской среде Symfony2

0

То, что я хотел бы сделать, это разделить /{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.

Теги:

1 ответ

0

Возможно, вы захотите рассмотреть 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню