Подтвердить что ты не робот

Symfony2: получить список всех маршрутов контроллера

У меня есть контроллер, который реализует все маршруты/URL-адреса, которые используются для показа справочных страниц. Маршруты определяются аннотациями. У меня возникла идея предложить общий индекс по всем страницам справки. Есть ли способ получить все маршруты, определенные контроллером (изнутри контроллера)?

4b9b3361

Ответ 1

Вы можете получить все маршруты, затем создать массив, а затем передать маршруты для этого контроллера на свою ветку.

Это не очень красивый способ, но он работает.. для 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 ;

Ответ 2

Что вы можете сделать, это использовать 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>"

чтобы отобразить все соответствующие маршруты

Чтобы отобразить все маршруты в контроллере, в основном с тем же выходом Я бы использовал следующее в контроллере (это тот же подход, который используется в команде router: debug в компоненте 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 и др.

Ответ 3

Я искал, чтобы сделать это, и после поиска кода я придумал это решение, которое работает для одного контроллера (или любого ressource на самом деле). Работает на 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)
}