У меня есть контроллер, который реализует все маршруты/URL-адреса, которые используются для показа справочных страниц. Маршруты определяются аннотациями. У меня возникла идея предложить общий индекс по всем страницам справки. Есть ли способ получить все маршруты, определенные контроллером (изнутри контроллера)?
Symfony2: получить список всех маршрутов контроллера
Ответ 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)
}