Наследование цепей Symfony2 потеряет родительские пучки

Я пытаюсь создать простое наследование наложения, как указано здесь, и столкнулся с проблемой с маршрутами. Я использую аннотации для маршрутизации. Когда я регистрирую свой дочерний пакет в 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 всегда будет выбирать первый соответствующий ему маршрут, вы можете переопределить определенный маршрут, написав соответствующий код маршрутизации поверх кода импорта.