2012-02-16 4 views
2

Возможно ли получить информацию об определенном маршруте по его названию или получить список всех маршрутов?Symfony 2: Как получить маршрут по умолчанию по названию маршрута?

Мне нужно получить значение _controller в defaults для любого маршрута, а не только для тока.

Это возможно и как?

P.S .: Я нашел, что могу найти путь к используемым YAML-маршрутам, но повторное использование кажется ненужным и тяжелым.

ответ

5

Я очень хорошо ответить на мои собственные вопросы ..

Чтобы получить маршруты использовать getRouteCollection() на маршрутизаторе ($this -> get('router') -> getRouteCollection() внутри контроллера), то вы получите экземпляр RouteCollection, на котором вы можете all() или get($name).

+4

Помните, что 'getRouteCollection' не использует кешированные значения, поскольку его целью является восстановление кеша. Поэтому назвать его крайне не рекомендуется. Он не предназначен для использования в производственном коде и имеет высокую производительность (см. [Обсуждение о загрузчике маршрутизации YML, который не кэшируется во время выполнения] (https://github.com/symfony/symfony/issues/7368#issuecomment-15146130)). – flu

+0

... Я действительно хорошо нахожу свои собственные ответы ... – flu

0

Как описано в моем комментарии выше, Router::getRouteCollection действительно медленный и не предназначен для использования в производственном коде.

Так что, если вам действительно нужно это быстро, вам нужно пробиться через него. Имейте в виду, это будет хаком:


Прямой доступ затопленных данные маршрута

Для ускорения согласования маршрута, Symfony собирает все статические маршруты в один большой файл PHP класса. Этот файл генерируется Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper и объявляет Symfony\Component\Routing\Generator\UrlGenerator, в котором хранятся все определения маршрутов в приватном статике под названием $declaredRoutes.

$declaredRoutes - это массив скомпилированных полей маршрута, проиндексированных по названию маршрута. Среди других (см. Ниже) эти поля также содержат значения по умолчанию для маршрута.

Для доступа $declaredRoutes мы должны использовать \ReflectionProperty.

Так фактический код:

// If you don't use a custom Router (e.g., a chained router) you normally 
// get the Symfony router from the container using: 
// $symfonyRouter = $container->get('router'); 
// After that, you need to get the UrlGenerator from it. 
$generator = $symfonyRouter->getGenerator(); 

// Now read the dumped routes. 
$reflectionProperty = new \ReflectionProperty($generator, 'declaredRoutes'); 
$reflectionProperty->setAccessible(true); 
$dumpedRoutes = $reflectionProperty->getValue($generator); 

// The defaults are at index #1 of the route array (see below). 
$routeDefaults = $dumpedRoutes['my_route'][1]; 

Поля маршрута массива

Поля каждого маршрута заполняются выше Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper так:

// [...] 
$compiledRoute = $route->compile(); 

$properties = array(); 
$properties[] = $compiledRoute->getVariables(); 
$properties[] = $route->getDefaults(); 
$properties[] = $route->getRequirements(); 
$properties[] = $compiledRoute->getTokens(); 
$properties[] = $compiledRoute->getHostTokens(); 
$properties[] = $route->getSchemes(); 
// [...] 

Таким образом, чтобы получить доступ к его требованию Энты вы будете использовать:

$routeRequirements = $dumpedRoutes['my_route'][2]; 

Нижняя линия

Я посмотрел через руководство Symfony, исходный код, форумы, StackOverflow и т.д., но до сих пор не удалось найти лучший способ сделать это.

Это жестоко, игнорирует API и может разорваться в будущих обновлениях (хотя он не изменился в последнем Symfony 3.4: PhpGeneratorDumper on GitHub).

Но он довольно короткий и достаточно быстрый, чтобы использоваться в производстве.

Смежные вопросы