Я пытаюсь создать простое наследование наложения, как указано здесь, и столкнулся с проблемой с маршрутами. Я использую аннотации для маршрутизации. Когда я регистрирую свой дочерний пакет в AppKernel.php, все мои пути родительских пакетов теряются.
Насколько я понимаю из документации, Symfony2 должен искать все файлы, включая маршруты, сначала из дочернего пакета, а затем из родительского пакета. Теперь, когда этого не происходит, загружаются только контроллеры дочерних пучков.
В моем дочернем пакете Bundle файл я реализовал функцию getParent, как указано, и в моем routing.yml у меня есть:
ParentBundle: resource: "@Parent/Controller/" type: annotation prefix: /admin/
который отлично работал до наследования.
Я тестировал, что система работает нормально, если в нее включены все файлы контроллеров по-разному в routing.yml, но это кажется очень громоздким способом заставить наследование работать, поскольку я только хочу переопределить несколько частей родительского пакета (не все контроллеры).
Профилировщик показывает оба моих пакета как активные.
Я нашел правильное решение для этой проблемы. Сегодня я также пытался переопределить родительский пакет, настроенный с помощью маршрутизации аннотаций, а также обнаружил, что родительские маршруты игнорировались, если маршрутизация анотаций импортировала весь пакет («@ SomeBundle / Controller»).
После небольшой отладки я обнаружил, что объяснение этого заключается в том, что если вы используете «@» в качестве префикса для контроллера, это перейдет к решателю ядра, который вернет ТОЛЬКО дочерний ресурс, если родительский ресурс был переопределен. Таким образом, решение состоит в том, чтобы предоставить полный путь пакета, учитывая, что ядро попытается сопоставить ресурс из приложения / ресурсов, поэтому вам нужно будет добавить относительный каталог (../../) до фактического пути:
# app/config/routing.yml: some_parent: resource: "../../src/Application/ParentBundle/Controller" type: annotation # ChildBundle implements getParent() method to inherit from ParentBundle some_child: resource: "@ChildBundle/Controller" type: annotation
Это будет работать так, как ожидалось: все родительские маршруты будут импортированы и будут переопределены всеми маршрутами, указанными в дочернем комплекте.
В дополнение к предыдущему ответу, мне также пришлось изменить имя routing.yml дочернего пакета (например, routing_child.yml), чтобы заставить его работать. Я предполагаю, что это потому, что Symfony полностью игнорирует файл маршрутизации родительского пакета, если имя идентично.
EDIT: Во многих случаях также целесообразно импортировать маршруты родительских пакетов в файл маршрутизации дочернего пакета следующим образом:
# routing_child.yml _parent: resource: "@MyParentBundle/Resources/config/routing.yml"
В официальной документации говорится, что вы должны просто скопировать родительский файл маршрутизации в ваш дочерний пакет:
Самый простой способ «переопределить» маршрутизацию пакета – никогда не импортировать его вообще. Вместо импорта маршрутизации стороннего пакета, просто скопировав этот файл маршрутизации в ваше приложение, измените его и импортируйте вместо него.
Кроме того, вы не можете включить родительский файл маршрутизации пакетов с использованием символических имен «@ParentBundle», потому что это имя разрешено для «@ChildBundle».
Если вы действительно хотите включить файл родительских маршрутов, то вы должны использовать абсолютный путь к этому файлу или пути относительно текущего каталога, то есть:
# @YourChildBundle/Resources/routing.yml YourParentBundle: resource: "/srv/www/example.com/src/Your/ParentBundle/Resources/routing.yml"
или
# @YourChildBundle/Resources/routing.yml YourParentBundle: resource: "../../../../../Your/ParentBundle/Resources/routing.yml"
Другим обходным решением является симплексная ссылка вашего родительского файла маршрутизации на ваш дочерний пакет и включение его с более коротким путем, то есть:
cd YourChildBunde ln -s ../../../../../Your/ParentBundle/Resources/routing.yml parent_routes.yml
а потом
# @YourChildBundle/Resources/routing.yml YourParentBundle: resource: "parent_routing.yml"
PS Я надеюсь, что они найдут лучший и менее уродливый способ переопределить и расширить маршрутизацию из родительского пакета, но теперь мы должны рассмотреть некоторые из этих уродливых обходных решений.
С наложением наложения вы можете переопределить файлы родительского пакета.
Если вы создаете файл маршрутизации в том же месте, что и родители в вашем пакете (если маршрутизация родительского файла находится в ParentBundle / Resources / config / routing.yml, и вы создаете файл маршрутизации в ChildBundle / Resources / config / routing .yml), он переопределит routing.yml родителя, и symfony будет использовать только routing.yml.
Я не пробовал, но если вы импортируете routing.yml родительского пакета в routing.yml дочернего пакета, вы можете решить свою проблему. Поскольку маршрутизатор Symfony всегда будет выбирать первый соответствующий ему маршрут, вы можете переопределить определенный маршрут, написав соответствующий код маршрутизации поверх кода импорта.