Symfony 2: Как получить значения по умолчанию для маршрута по имени? - PullRequest
2 голосов
/ 16 февраля 2012

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

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

Возможно ли это и как?

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

Ответы [ 2 ]

6 голосов
/ 16 февраля 2012

Я действительно хорошо отвечаю на свои вопросы ..

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

2 голосов
/ 06 июля 2017

Как описано в моем комментарии выше 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 4.1: PhpGeneratorDumper на GitHub ).

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

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