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());