Нахождение маршрута в конкретном комплекте - PullRequest
1 голос
/ 02 ноября 2011

Я реализую веб-приложение с использованием Symfony 2. У него есть главная страница, которая обслуживается через «CoreBundle», который загружает содержимое других пакетов приложений в div.Чтобы справиться с этим, я хочу, чтобы маршрут CoreBundle перехватывал все маршруты, а затем перенаправлял запрос пакетам приложений, чтобы получить содержимое внутри div.

маршрут:

@Route("{app_name}/{garbage}", name="_core_app_garbage", requirement={"garbage"=".*"})

Это прекрасно работает.Он захватывает все маршруты с $ app_name, установленным на имя приложения (первый подкаталог), а остальная часть URI находится внутри $ garbage.

Моя проблема заключается в попытке найти маршрут для $ garbage в пределах определенногоприложение.Базовый пакет знает имя пакета для приложения.

До сих пор я пробовал следующие две вещи:

  1. Используйте службу маршрутизатора, чтобы найти маршрут, нопопытка удалить маршрут «поймать все»:

    $router->getRouteCollection()->remove("_core_app_garbage");
    

    Это, похоже, ничего не меняет (маршрут, который я получаю, все еще остается «поймать все»).

  2. Создание собственного роутера.Я пробовал различные конфигурации, но, похоже, требуется много созданий классов и конкретных созданий классов (в моем случае AnnotationDirectoryLoader).Это кажется слишком трудным для того, к чему я привык в Symfony, и оно не переносимо, если я решу изменить формат маршрутизации (например, на YAML).

Есть ли это быстро и легко?способ сделать это?

1 Ответ

1 голос
/ 05 ноября 2011

Я нашел довольно хорошее решение, хотя оно и не идеально:

По сути, я загружаю коллекцию маршрутов для определенного пакета, используя сервис 'routing.loader'.Затем я создаю свой собственный UrlMatcher для сопоставления с этими маршрутами.

// Get the route collection for the app's bundle
$kernel = $this->container->get('kernel');
$routingFilesLocation = $kernel->locateResource( '@'. $app->getBundle() . '/Controller/' );
$routeLoader = $this->container->get('routing.loader');
$collection = $routeLoader->load( $routingFilesLocation );

// Ensure that we don't get in a redirect loop when
// loading the dashboard of core
$collection->remove( '_core_redirect_home' );

// Try to match the rest of the url to one of the routes
$router = $this->container->get('router');
$routeString = $routingFilesLocation . "<br/>";
$url =  "/" . $garbage;

$matcher = new UrlMatcher( $collection, $router->getContext() );
try
{
    $routes = $matcher->match( $url );
}
catch( ResourceNotFoundException $e )
{
    throw $this->createNotFoundException( 'Could not find "' . $url . '" route within ' . $app_name );
}
$response = $this->forward( $routes['_controller'] );

Проблема здесь в том, что я жестко запрограммировал поиск только контроллеров в папке «Controller» в комплекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...