Symfony 4 печатает все маршруты

Я пытаюсь настроить индексную страницу, которая будет распечатывать все конечные точки в API (используя Symfony 4).

В Symfony 2 вы могли получить маршрутизатор и через контейнер, а затем набор маршрутов. Но похоже, что у вас нет доступа к контейнеру прямо из коробки в Symfony 4.

Поиск Google, похоже, не дает точного результата, который я ищу. Есть ли альтернативный способ сделать это в Symfony 4 или что-то подобное?


person RokDev    schedule 30.05.2018    source источник
comment
почему бы не использовать функцию exec php для запуска php bin/console debug:router?   -  person treyBake    schedule 30.05.2018
comment
Я хотел бы иметь больше свободы, например, иметь их в коллекции, чтобы я мог повторять и т.д.   -  person RokDev    schedule 30.05.2018


Ответы (2)


Итак, я собрал кусочки вместе:

Кажется, самый простой способ - ввести Symfony\Component\Routing\RouterInterface, а затем использовать его как Router. Как я упоминал в вопросе, вы можете получить маршруты, используя $router->getRouteCollection()->all(), где $router — это внедренная зависимость.

E.g.:

use Symfony\Component\Routing\RouterInterface;

public function someMethodInController(Request $request, RouterInterface $router)
{
    $routes = $router->getRouteCollection()->all();
    // ...
}
person RokDev    schedule 30.05.2018

Используйте в любом контроллере, это вернет вам массив доступных объектов маршрута.

$router = $this->get('router');
$routes = $router->getRouteCollection()->all();
person Zeppe    schedule 30.05.2018
comment
вы всегда должны добавлять объяснение, чтобы люди понимали, а не знали, как - person treyBake; 30.05.2018
comment
Справедливо, но OP сам это почти буквально предоставил: В Symfony 2 вы могли получить маршрутизатор и через контейнер, а затем набор маршрутов. - person Loek; 30.05.2018
comment
Все методы контроллера имеют доступ к ресурсам контейнера? - person Zeppe; 30.05.2018
comment
@Zeppe Начиная с S3.4, 4 появился новый базовый класс контроллера под названием AbstractController. Если ваш контроллер расширяется от него, у вас больше нет общего доступа к контейнеру. Однако есть некоторые службы, к которым вы можете получить доступ, какой маршрутизатор является одним из них. Так что то, что вы написали, должно действительно работать. Но инъекция такого рода вещей рекомендуется. - person Cerad; 30.05.2018
comment
@RokDev - от какого класса наследуется ваш контроллер? В то время как внедрение лучше, $this-›get('router'); действительно должно было сработать, если вы используете один из базовых классов контроллера Symfony. - person Cerad; 30.05.2018
comment
@Cerad, я думаю, это / была моя проблема, класс не расширяет какой-либо базовый класс контроллера. Спасибо! - person RokDev; 30.05.2018
comment
Что хорошо, если вы можете это сделать. Пока вам не нужны вспомогательные функции, определенные в ControllerTrait, никакой базовый класс контроллера не годится. - person Cerad; 30.05.2018