Я создаю приложение на Symfony 4, которое можно расширять с помощью плагинов. Плагины по сути представляют собой пакеты, но они просто помещаются в папку и не требуют активации (например, в config/bundles.php или config/routes/).
Чтобы плагины автоматически регистрировали маршруты, у меня есть цепочный маршрутизатор CMF, переопределяющий службу Symfony @router по умолчанию. Каждый плагин может иметь сервисный тег router, который маршрутизатор цепочки добавляет в цепочку. Эта часть работает.
Чтобы подключаемым модулям было проще регистрировать маршруты, основное приложение предоставляет класс AnnotationRouter, который берет путь для поиска аннотированных контроллеров. Затем подключаемые модули регистрируют такую службу:
sample_plugin.router:
class: MyApp\Routing\AnnotationRouter
arguments: ['@service_container', '@@SamplePlugin/Controller']
tags:
- { name: router, priority: 20 }
Однако эти маршруты ведут себя очень странно. Фактически, они работают только по первому запросу после очистки кеша! Все последующие запросы возвращают ошибки 404. Так выглядит вкладка «Routing» в профилировщике Symfony.
Сверху написано, что маршрут не совпадает, а внизу совпадает! Я не знаю, что с этим делать.
Кроме того, bin/console router:match /test2 соответствует маршруту, а bin/console debug:router отображает маршрут. Все маршруты маршрутизатора Symfony по умолчанию (который является единственным другим маршрутизатором в цепочке, кроме маршрутизатора плагина) работают должным образом.
Интересно, что все это работало раньше, когда еще использовалось Symfony 3.






Хорошо, оказывается, это проблема не в маршрутизаторе цепочки маршрутизации CMF, а в реализации настоящего маршрутизатора.
Моя реализация маршрутизатора описана в этот вопрос. Проблема была связана с программой чтения аннотаций Doctrine и автозагрузкой аннотаций. Я закончил тем, что установил indigophp/doctrine-annotation-autoload, что, по-видимому, является лишь временным решением.
См. Также Автозагрузка классов аннотаций на GitHub.