web-dev-qa-db-fra.com

Comment obtenir la liste de toutes les routes d'un contrôleur dans Symfony2?

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?

45
Sammy

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 ;
25
qooplmao

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.

117
DerStoffel

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)
}
19
yancg

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'

Puis dans votre fichier twig) pour renseigner une variable javascript à utiliser dans vos scripts

<script>
    var Routes = {
        {% for route_name, route_path in routes_service.routes %}
            {{ route_name }}: '{{ route_path }}',
        {% endfor %}
    }
</script>
3
C Alex

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
------------------------------------------------------------------------- -------------------------------------
0
rob