Symfony2 - способ получить все контроллеры в комплекте?
Есть ли способ получить все контроллеры (и класс) комплекта? Включая все родительские контроллеры?
Спасибо
2 ответа
Наиболее реалистичным способом для этого является получение конечных точек маршрутов.
Контроллер не имеет требуемой структуры, как следует из документации. Метод действия не обязательно должен содержать суффикс Action
во имя. Причина, по которой это задокументировано таким образом, заключается в том, что многие люди используют конфигурацию перехвата всех в своем yml маршрутизации, суффикс необходим для угадывания конечных точек.
Когда вы распечатываете маршруты:
print_r($this->container->get('router')->getRouteCollection()->all());
Вы увидите методы контроллера, используемые для каждого маршрута. Эти маршруты технически не принадлежат ни к какому пакету, так как вы можете указать маршрут для любого метода любого класса.
Тем не менее, вы можете использовать список и немного магии строк, чтобы сообщить пакету на основе пространства имен.
Имейте ввиду, что _controller
лайк web_profiler.controller.profiler:infoAction
означает, что метод принадлежит службе, созданной с помощью внедрения зависимостей.
Хотя нет никакого официального способа получить контроллеры, вы можете использовать следующий код для получения всех контроллеров:
$bundles = $this->container->getParameter('kernel.bundles');
$controllers = [];
foreach ($bundles as $bundle) {
$reflection = new \ReflectionClass($bundle);
$controllerDirectory = dirname($reflection->getFileName()) . '/Controller';
if (file_exists($controllerDirectory)) {
$d = dir($controllerDirectory);
while (false !== ($entry = $d->read())) {
if (preg_match("/^([A-Z0-9-_]+Controller).php/i", $entry, $matches)) {
$controllers[] = ['fileName' => $controllerDirectory. '/'. $entry, 'class' => $reflection->getNamespaceName() . '\Controller\\' . $matches[1]];
}
}
$d->close();
}
}
print_r($controllers);