Php Symfony 2:如何通过路由名称获取路由默认值?

Php Symfony 2:如何通过路由名称获取路由默认值?,php,symfony,routes,Php,Symfony,Routes,是否可以按某条路线的名称检索该路线的信息,或获取所有路线的列表 我需要能够获取任何路由的\u controller值,而不仅仅是当前路由 这可能吗?如何实现 旁白:我发现我可以找到YAML正在使用的路线,但重新铺设它似乎不必要而且沉重。我真的很擅长回答我自己的问题 要获取路由,请在路由器上使用getRouteCollection()($this->get('router')->>getRouteCollection()在控制器内部),然后获取可以all()或get($name)的RouteCol

是否可以按某条路线的名称检索该路线的信息,或获取所有路线的列表

我需要能够获取任何路由的
\u controller
值,而不仅仅是当前路由

这可能吗?如何实现


旁白:我发现我可以找到YAML正在使用的路线,但重新铺设它似乎不必要而且沉重。

我真的很擅长回答我自己的问题


要获取路由,请在路由器上使用
getRouteCollection()
$this->get('router')->>getRouteCollection()
在控制器内部),然后获取可以
all()
get($name)的RouteCollection实例

正如我在上面的评论中所描述的
路由器::getRouteCollection
非常慢,不适合在生产代码中使用

因此,如果你真的需要它的速度,你必须通过你的方式通过它。请注意,这将是一种骇客行为:


直接访问转储的路由数据

为了加快路由匹配,Symfony将所有静态路由编译成一个大的PHP类文件。此文件由
Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper
生成,并声明一个
Symfony\Component\Routing\Generator\UrlGenerator
,该文件将所有路由定义存储在名为
$declaredRoutes
的私有静态文件中

$declaredRoutes
是一个已编译路由字段数组,按路由名称索引。除其他字段外(见下文),这些字段还包含路由默认值

为了访问
$declaredRoutes
,我们必须使用一个

因此,实际代码是:

// 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\phpgenerator-Dumper
填充,如下所示:

// [...]
$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:)中没有更改


但是它非常短且速度快,可以在生产中使用。

请记住,
getRouteCollection
不使用任何缓存值,因为它的目的是重建缓存。所以说这是非常不鼓励的。它不适用于生产代码,并且对性能有很高的影响(请参见:)。请注意,您不能通过这种方式获取路由选项,显然,根据symfony的说法,devs选项仅用于编译阶段。@WiR3D…但这不会阻止您从
declaredRoutes
属性中读取选项。正如我所说的,这不符合API,将来可能会中断,但这是获得路由默认选项的一种有效方法。请记住,问题不在于改变选项。这是不可能的,因为路由已经编译好了。但是读取它们是可能的。是的,你可以读取
declaredRoutes
,但它不会缓存所有的路线信息,例如它会在
默认值中缓存数据,但它不会在
选项中缓存数据。啊,现在我明白你上一篇文章的意思了。是的,没错。从上面的摘录中可以看出,
$route->getOptions()
未存储在
$properties
数组中。