Можно ли получить информацию об определенном маршруте по его названию или получить список всех маршрутов?
Мне нужно получить значение _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 ).
Но он довольно короткий и достаточно быстрый, чтобы использоваться в производстве.