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
数组中。