2013-04-11 32 views
35

我有一个控制器,它实现了用于显示帮助页面的所有路由/ url。 路线由注释定义。 我的想法是为所有帮助页面提供一个通用索引。有没有办法让控制器(从控制器内)定义的所有路由?Symfony2:获取控制器所有路由的列表

回答

23

你可以得到所有的路线,然后创建从一个数组,然后传递路线那个控制器给你的树枝。

这不是一个漂亮的方式,但它的工作原理.. 2.1不管怎么说..

/** @var $router \Symfony\Component\Routing\Router */ 
    $router = $this->container->get('router'); 
    /** @var $collection \Symfony\Component\Routing\RouteCollection */ 
    $collection = $router->getRouteCollection(); 
    $allRoutes = $collection->all(); 

    $routes = array(); 

    /** @var $params \Symfony\Component\Routing\Route */ 
    foreach ($allRoutes as $route => $params) 
    { 
     $defaults = $params->getDefaults(); 

     if (isset($defaults['_controller'])) 
     { 
      $controllerAction = explode(':', $defaults['_controller']); 
      $controller = $controllerAction[0]; 

      if (!isset($routes[$controller])) { 
       $routes[$controller] = array(); 
      } 

      $routes[$controller][]= $route; 
     } 
    } 

    $thisRoutes = isset($routes[get_class($this)]) ? 
           $routes[get_class($this)] : null ; 
+0

这就是我错过的: $ router = $ this-> container-> get('router'); $ collection = $ router-> getRouteCollection(); $ allRoutes = $ collection-> all(); THX – Sammy 2013-04-12 06:26:40

+0

但是这不会显示没有定义名称的路由,例如。 '@Route( “/新闻”)'。当我尝试你的方法,因为没有'name ='news_route''参数,我无法得到这条路线。任何人有类似的问题? – 2014-05-21 10:23:51

+0

据我所知,如果您使用注释并且不声明名称,那么名称是从包名称,控制器名称和操作名称自动生成的(使用'name = news_route'只是覆盖此默认操作)。因此对于'Bills \ BlogBu​​ndle','NewsController','indexAction'这个名字会自动生成为'bills_blog_news_index'。 – qooplmao 2014-05-21 15:27:19

103

你可以做的是使用CMD与(最多SF2.6)

php app/console router:debug 

随着SF 2.7的命令是

php app/console debug:router 

随着SF 3.0的命令是

php bin/console debug:router 

它显示你所有的路线。

如果你定义了每个控制器(我推荐)的前缀例如,你可以使用

php app/console router:debug | grep "<prefixhere>" 

显示出所有符合路线

要显示得到控制所有的路线,基本相同的输出 我最好使用如下所示的控制器内(它是在路由器中使用的同样的方法:在symfony的部件调试命令)

/** 
* @Route("/routes", name="routes") 
* @Method("GET") 
* @Template("routes.html.twig") 
* 
* @return array 
*/ 
public function routeAction() 
{ 
    /** @var Router $router */ 
    $router = $this->get('router'); 
    $routes = $router->getRouteCollection(); 

    foreach ($routes as $route) { 
     $this->convertController($route); 
    } 

    return [ 
     'routes' => $routes 
    ]; 
} 


private function convertController(\Symfony\Component\Routing\Route $route) 
{ 
    $nameParser = $this->get('controller_name_converter'); 
    if ($route->hasDefault('_controller')) { 
     try { 
      $route->setDefault('_controller', $nameParser->build($route->getDefault('_controller'))); 
     } catch (\InvalidArgumentException $e) { 
     } 
    } 
} 

routes.html.twig

<table> 
{% for route in routes %} 
    <tr> 
     <td>{{ route.path }}</td> 
     <td>{{ route.methods|length > 0 ? route.methods|join(', ') : 'ANY' }}</td> 
     <td>{{ route.defaults._controller }}</td> 
    </tr> 
{% endfor %} 
</table> 

输出将是:

/_wdt/{token} ANY web_profiler.controller.profiler:toolbarAction

+0

对不起!我想从控制器中访问这些信息,以便它可以生成一个索引。 – Sammy 2013-04-11 09:40:13

+0

我怀疑路由组件是否关心控制器。 – DerStoffel 2013-04-11 09:53:07

+0

这意味着什么?有没有机会获得这些信息? – Sammy 2013-04-11 11:03:43

17

我一直在寻找这一点和搜索代码之后做的,我想出了这个解决方案,适用于单控制器(或任何实际的资源)。在Symfony 2.4上工作(我没有用以前的版本测试过):

$routeCollection = $this->get('routing.loader')->load('\Path\To\Controller\Class'); 

foreach ($routeCollection->all() as $routeName => $route) { 
    //do stuff with Route (Symfony\Component\Routing\Route) 
} 
+0

有趣的方式来获得控制器的所有操作(路线)。 – 2016-04-30 16:59:40

+0

这太棒了,你应该得到更多的选票。 – Xatenev 2016-06-17 08:39:33

+0

可爱,干净。 – DevDonkey 2016-08-03 11:00:19

相关问题