J'ai un contrôleur qui implémente tous les routes/URL (s). J'ai eu l'idée de proposer un index générique sur toutes les pages d'aide.
Existe-t-il un moyen d’obtenir tous les itinéraires définis par un contrôleur (depuis un contrôleur) dans Symfony2
?
Vous pouvez obtenir toutes les routes, puis créer un tableau à partir de cela et ensuite transmettre les routes pour ce contrôleur à votre brindille.
Ce n'est pas beau mais ça marche .. pour 2.1 de toute façon ..
/** @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 ;
Ce que vous pouvez faire est d’utiliser la cmd avec (jusqu’à SF2.6)
php app/console router:debug
Avec SF 2.7, la commande est
php app/console debug:router
Avec SF 3.0, la commande est
php bin/console debug:router
qui vous montre tous les itinéraires.
Si vous définissez un préfixe par contrôleur (que je recommande), vous pouvez par exemple utiliser
php app/console router:debug | grep "<prefixhere>"
pour afficher tous les itinéraires correspondants
Pour afficher toutes vos routes dans le contrôleur, avec essentiellement la même sortie, j'utiliserais les éléments suivants dans un contrôleur (c'est la même approche que celle utilisée dans le routeur: commande debug dans le composant 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>
La sortie sera:
/_wdt/{token} ANY web_profiler.controller.profiler:toolbarAction
etc.
Je cherchais justement à faire cela et après avoir recherché le code, je suis arrivé à cette solution qui fonctionne pour un seul contrôleur (ou toute ressource en fait). Fonctionne sur Symfony 2.4 (je n’ai pas testé avec les versions précédentes):
$routeCollection = $this->get('routing.loader')->load('\Path\To\Controller\Class');
foreach ($routeCollection->all() as $routeName => $route) {
//do stuff with Route (Symfony\Component\Routing\Route)
}
Si quelqu'un tombe sur cette question, voici comment j'ai exporté les itinéraires dans la portée globale twig (symfony 4).
src/Helper/Route.php
<?php
namespace App\Helper;
use Symfony\Component\Routing\RouterInterface;
class Routes
{
private $routes = [];
public function __construct(RouterInterface $router)
{
foreach ($router->getRouteCollection()->all() as $route_name => $route) {
$this->routes[$route_name] = $route->getPath();
}
}
public function getRoutes(): array
{
return $this->routes;
}
}
src/config/packages/twig.yaml
twig:
globals:
route_paths: '@App\Helper\Routes'
<script>
var Routes = {
{% for route_name, route_path in routes_service.routes %}
{{ route_name }}: '{{ route_path }}',
{% endfor %}
}
</script>
Dans Symfony 4, je souhaitais regrouper toutes les routes, y compris le contrôleur et les actions. Dans Rails vous pouvez l'obtenir par défaut.
Dans Symfony, vous devez ajouter le paramètre show-controllers
au debug:router
commande.
Si quelqu'un cherche la même fonctionnalité, il peut se faire avec:
bin/console debug:router --show-controllers
cela produira une liste comme celle-ci
------------------------------------------------------------------------- -------------------------------------
Name Method Scheme Host Path Controller
------------------------------------------------------------------------- -------------------------------------
app_some_good_name ANY ANY ANY /example/example ExampleBundle:Example:getExample
------------------------------------------------------------------------- -------------------------------------