How to get list of all routes of a controller in Symfony2?
What you can do is use the cmd with (up to SF2.6)
php app/console router:debug
With SF 2.7 the command is
php app/console debug:router
With SF 3.0 the command is
php bin/console debug:router
which shows you all routes.
If you define a prefix per controller (which I recommend) you could for example use
php app/console router:debug | grep "<prefixhere>"
to display all matching routes
To display get all your routes in the controller, with basically the same outputI'd use the following within a controller (it is the same approach used in the router:debug command in the symfony component)
/** * @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>
Output will be:
/_wdt/{token} ANY web_profiler.controller.profiler:toolbarAction
etc.
You could get all of the routes, then create an array from that and then pass the routes for that controller to your twig.
It's not a pretty way but it works.. for 2.1 anyways..
/** @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 ;
I was looking to do just that and after searching the code, I came up with this solution which works for a single controller (or any ressource actually). Works on Symfony 2.4 (I did not test with previous versions) :
$routeCollection = $this->get('routing.loader')->load('\Path\To\Controller\Class');foreach ($routeCollection->all() as $routeName => $route) { //do stuff with Route (Symfony\Component\Routing\Route)}