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)
}
- 1. AngularJS - pobierz listę zdefiniowanych tras - $ routeProvider
- 2. Pokaż listę wszystkich tras w Akka HTTP
- 3. Pobierz listę wszystkich importów w projekcie Haskell
- 4. Jak uzyskać listę wszystkich tras używanych w aplikacji Sinatra?
- 5. Sprawdzanie poprawności tras z kontrolera
- 6. Url.Action z WebAPI i kontrolera tras
- 7. Ustawienie max_execution_time dla określonego kontrolera w symfony2
- 8. Jak przetestować subdomen na podstawie tras w Symfony2
- 9. Mongoose: Pobierz pełną listę użytkowników
- 10. Pobierz listę zmiennych #define
- 11. Express - przekazywanie danych do wszystkich tras
- 12. ngRoute ustaw adres bazowy dla wszystkich tras
- 13. Test funkcjonalny kontrolera symfony2: Jak wygenerować trasę
- 14. przekazywanie danych z kontrolera do Type symfony2
- 15. Symfony2 tworzenia pierwszego kontrolera, ale 404
- 16. wysłać e-maila do kontrolera akcji Symfony2
- 17. Pobierz listę znajomych z Facebooka
- 18. Pobierz listę mniej zmiennych za pomocą less.js
- 19. Pobierz zmienne środowiskowe w pliku symfony2 parameters.yml
- 20. HWIOAuthBundle - Symfony2 - Pobierz dane użytkownika z Facebooka
- 21. Jak mogę dodać prefiks trasy do wszystkich kontrolerów w Symfony2?
- 22. Pobierz listę plików z serwera FTP
- 23. Dynamiczny adres URL -> Mapowanie kontrolera dla tras w Railsach
- 24. Jak utworzyć czarną listę IP w Symfony2?
- 25. Wyświetl listę wszystkich właściwości obiektu
- 26. Wyświetl listę wszystkich zainstalowanych aplikacji.
- 27. $ em-> remove() symfony2 kasowanie wszystkich wierszy
- 28. listę wszystkich dostępnych sterowników drukarki (jak Kreator dodawania drukarki)
- 29. Jak uzyskać listę tras z modułu/katalogu w Laravel 5?
- 30. Jak mogę uzyskać listę wszystkich działań kontrolera MVC, przekazując nazwę ControllerName?
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