Как описано в моем комментарии выше 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 ).
Но он достаточно короткий и достаточно быстрый для использования в производстве.