2013-04-11 12 views
35

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

23

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 ; 
+0

Tego właśnie mi brakowało: $ router = $ this-> container-> get ('router'); $ collection = $ router-> getRouteCollection(); $ allRoutes = $ collection-> all(); THX – Sammy

+0

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? –

+0

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

103

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

+0

Przepraszamy! Chciałbym uzyskać dostęp do tych informacji z poziomu kontrolera, aby mógł wygenerować indeks. – Sammy

+0

Wątpię, aby komponent routingu dbał o kontroler. – DerStoffel

+0

A to oznacza? Czy jest szansa na zdobycie tych informacji, czy nie? – Sammy

17

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) 
} 
+0

Interesujący sposób uzyskania wszystkich działań (tras) dla kontrolera. –

+0

To świetnie, zasługujesz na więcej głosów. – Xatenev

+0

piękne i czyste. – DevDonkey

Powiązane problemy