Как создать RouteCollection из папки контроллеров с аннотироваными методами?

Всем доброго времени суток!

В процессе изучения и эксперементирования с компонентами Symfony возникла следующая задача:
В корне проекта есть папка src/Controllers в которой лежат контроллеры. Методы в них аннотированы. Необходимо пройтись по всем контроллерам в папке и подпапках, и собрать маршруты в Symfony класс RouteCollection.

Просьба к людям знающим помочь с данным вопросом!

P.S. Используется только компонент route, а не весь фреймворк
  • Вопрос задан
  • 268 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
1. Вам надо создать AnnotationClassLoader, задачей которого преобразовывать аннотации в роуты. Абстрактный класс есть в компоненте, вам надо только определить метод configureRoute. За основу можно взять код из фреймворка
Должно получится что-то вроде этого:

namespace App\Router;

use Symfony\Component\Routing\Loader\AnnotationClassLoader as BaseLoader;
use Symfony\Component\Routing\Route;

class AnnotationClassLoader extends BaseLoader
{
    protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot)
    {
        if ('__invoke' === $method->getName()) {
            $route->setDefault('_controller', $class->getName());
        } else {
            $route->setDefault('_controller', $class->getName().'::'.$method->getName());
        }
    }
}



2. И сконфигурировать все это дело (придется использовать symfony/config):
use секция, на всякий случай

use App\Router\AnnotationClassLoader;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader;
use Symfony\Component\Routing\Loader\AnnotationFileLoader;
use Symfony\Component\Routing\Router;


$autoloader = require_once __DIR__ . '/../vendor/autoload.php';

AnnotationRegistry::registerLoader(array($autoloader, 'loadClass'));

$reader = new AnnotationReader();
$annotationClassLoader = new AnnotationClassLoader($reader);

$fileLocator = new FileLocator([__DIR__]);

$loaderResolver = new LoaderResolver([
    new AnnotationFileLoader($fileLocator, $annotationClassLoader),
    new AnnotationDirectoryLoader($fileLocator, $annotationClassLoader),
]);

$loader = new DelegatingLoader($loaderResolver);

$router = new Router($loader, __DIR__ . '/../src/Controller');

dump($router->getRouteCollection());
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
xEpozZ
@xEpozZ
Веб-разработчик
Посмотрите исходники консольной команды bin/console debug:router

https://symfony.com/doc/current/routing.html
Ответ написан
Комментировать
@Mysterion
Попробуйте:
$router = $this->container->get('router');
$routes = $router->getRouteCollection()->all();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы