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
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 ;
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
Sorry! Vorrei accedere a queste informazioni da un controller, in modo che possa generare un indice. – Sammy
Dubito che il componente di routing si preoccupi del controller. – DerStoffel
E questo significa? C'è la possibilità di ottenere queste informazioni o no? – Sammy
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)
}
Questo è quello che mi mancava: $ router = $ this-> container-> get ('router'); $ collection = $ router-> getRouteCollection(); $ allRoutes = $ collection-> all(); THX – Sammy
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? –
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