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