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

    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 комментария