Mam kontroler, który implementuje wszystkie trasy/adresy URL, które są używane do wyświetlania stron pomocy. Trasy są definiowane przez adnotacje. Wpadłem na pomysł, aby zaoferować ogólny indeks wszystkich stron pomocy. Czy istnieje sposób na uzyskanie wszystkich tras zdefiniowanych przez kontroler (z poziomu kontrolera)?Symfony2: pobierz listę wszystkich tras kontrolera
Odpowiedz
Można dostać wszystkie trasy, a następnie utworzyć tablicę z tego i następnie przejść do trasy ten kontroler do twig.
To nie jest dość droga, ale to działa .. dla 2,1 anyways ..
/** @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 ;
Co można zrobić, to skorzystać z cmd z (do SF2.6)
php app/console router:debug
Z SF 2.7 komenda jest
php app/console debug:router
Z SF 3.0 komenda jest
php bin/console debug:router
który pokazuje wszystkie trasy.
Jeśli zdefiniować prefiks za regulatorem (co polecam) można na przykład użyć
php app/console router:debug | grep "<prefixhere>"
aby wyświetlić wszystkie pasujące trasy
do wyświetlenia uzyskać wszystkie swoje trasy w sterowniku, ze w zasadzie samo wyjście użyję następujących w kontrolerze (to samo podejście stosuje się w routerze: polecenia debugowania w składniku 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>
wyjściowe będą:
/_wdt/{token} ANY web_profiler.controller.profiler:toolbarAction
itp
Przepraszamy! Chciałbym uzyskać dostęp do tych informacji z poziomu kontrolera, aby mógł wygenerować indeks. – Sammy
Wątpię, aby komponent routingu dbał o kontroler. – DerStoffel
A to oznacza? Czy jest szansa na zdobycie tych informacji, czy nie? – Sammy
Szukałem właśnie do tego i po wyszukaniu kodu, wpadłem na to rozwiązanie, które działa na pojedynczym kontroler (lub jakikolwiek ressource). Działa na Symfony 2.4 (nie testowałem w poprzednich wersjach):
$routeCollection = $this->get('routing.loader')->load('\Path\To\Controller\Class');
foreach ($routeCollection->all() as $routeName => $route) {
//do stuff with Route (Symfony\Component\Routing\Route)
}
Tego właśnie mi brakowało: $ router = $ this-> container-> get ('router'); $ collection = $ router-> getRouteCollection(); $ allRoutes = $ collection-> all(); THX – Sammy
Ale to NIE wyświetli tras, które nie mają zdefiniowanej nazwy, np. '@Route ("/news ")'. Kiedy wypróbowałem twoją metodę, ponieważ nie było parametru "name =" news_route "", nie mogłem uzyskać wspomnianej trasy. Ktoś miał podobny problem? –
O ile wiem, jeśli używasz adnotacji i nie deklarujesz nazwy, to nazwa jest generowana automatycznie z nazwy pakietu, nazwy kontrolera i nazwy działania (użycie 'name = news_route' po prostu przesłania tę domyślną akcję). Tak więc dla 'Bills \ BlogBundle',' NewsController', 'indexAction' nazwa będzie automatycznie generowana jako' bills_blog_news_index'. – qooplmao