2013-04-11 13 views
35

Ho un controller che implementa tutti i route/URL che vengono utilizzati per mostrare le pagine di aiuto. I percorsi sono definiti da annotazioni. Ho avuto l'idea di offrire un indice generico su tutte le pagine di aiuto. C'è un modo per ottenere tutte le rotte definite da un controller (da un controller)?Symfony2: ottiene l'elenco di tutti i percorsi di un controller

risposta

23

Si potrebbe ottenere tutti i percorsi, quindi creare una matrice da questo e poi passare i percorsi per quel controller per il tuo ramoscello.

Non è un modo abbastanza ma funziona .. per 2.1 in ogni modo ..

/** @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

Questo è quello che mi mancava: $ router = $ this-> container-> get ('router'); $ collection = $ router-> getRouteCollection(); $ allRoutes = $ collection-> all(); THX – Sammy

+0

Ma questo NON visualizzerebbe percorsi che non hanno un nome definito, ad es. '@Route ("/ news")'. Quando ho provato il tuo metodo in quanto non esisteva il parametro 'name =" news_route "', non ho potuto richiamare questa rotta. Qualcuno ha avuto un problema simile? –

+0

Per quanto ne so se usi le annotazioni e non dichiari un nome, il nome viene generato automaticamente dal nome del bundle, dal nome del controller e dal nome dell'azione, (l'uso di 'name = news_route' sostituisce solo questa azione predefinita). Quindi per 'Bills \ BlogBundle',' NewsController', 'indexAction' il nome verrebbe generato automaticamente come' bills_blog_news_index'. – qooplmao

103

Che cosa si può fare è utilizzare il cmd con (fino a SF2.6)

php app/console router:debug 

Con SF 2.7 il comando è

php app/console debug:router 

Con SF 3.0 il comando è

php bin/console debug:router 

che mostra tutti i percorsi.

Se si definisce un prefisso per controller (che vi consiglio) si potrebbe ad esempio utilizzare

php app/console router:debug | grep "<prefixhere>" 

per visualizzare tutti gli itinerari che corrispondono

Per visualizzare ottenere tutti i percorsi nel controller, con fondamentalmente la stessa uscita userei il seguente all'interno di un controller (è lo stesso approccio utilizzato nel router: il comando di debug nel componente 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> 

uscita sarà:

/_wdt/{token} ANY web_profiler.controller.profiler:toolbarAction ecc

+0

Sorry! Vorrei accedere a queste informazioni da un controller, in modo che possa generare un indice. – Sammy

+0

Dubito che il componente di routing si preoccupi del controller. – DerStoffel

+0

E questo significa? C'è la possibilità di ottenere queste informazioni o no? – Sammy

17

stavo cercando di fare proprio questo e dopo la ricerca del codice, mi si avvicinò con questa soluzione che funziona per un singolo controller (o qualsiasi risorsa in realtà). Funziona su Symfony 2.4 (non ho la prova con le versioni precedenti):

$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

modo interessante per ottenere tutte le azioni (percorsi) per un controller. –

+0

Questo è fantastico, ti meriti più voti. – Xatenev

+0

bello e pulito. – DevDonkey

Problemi correlati