I have a controller which implements all routes/URL(s). I had the idea to offer a generic index over all help-pages.
Is there a way to get all routes defined by a controller (from within 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 output I'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.