Intereting Posts
PHP Regex для целых слов Я пытаюсь, чтобы страница «Подробности» ссылалась на две отдельные части моего сервера, которые связаны через techID Не удается передать массив для публикации в PHP Плагин WordPress – добавьте новую страницу Как легко загружать файлы без отправки формы (с помощью jQuery + AJAX) Добавление в базу данных. Нет повторения при обновлении Отправить iPhone HTTP-запрос на веб-сервер Apache PHP Как добавить параметры продукта на странице категории в opencart 2.0 Как запустить PHP-код, когда пользователь нажимает на ссылку? Как установить расширение PHP локально на WAMP? Программно создавая CMS / страницу в Magento Как хранить несколько значений для одного элемента в ячейке в MySQL Отправка сообщений с php на java Помогите редактировать JSON, чтобы сделать массив, а не «словарь», Запрошенный PHP-расширение intl отсутствует в вашей системе (SonataAdminBundle) в Symfony2

Symfony 2: Как получить маршрут по умолчанию по названию маршрута?

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

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

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

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

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

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

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

Поэтому, если вы действительно нуждаетесь в этом быстро, вы должны взломать его. Будьте осторожны , это будет хакерским :


Прямой доступ к данным сбрасываемых маршрутов

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

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

Чтобы получить доступ к $declaredRoutes мы должны использовать \ ReflectionProperty .

Таким образом, фактический код:

 // If you don't use a custom Router (eg, 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 на GitHub ).

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