Утрата наследования пакетов Symfony2 родительские пакеты маршрутов - PullRequest
26 голосов
/ 21 февраля 2012

Я пытаюсь создать простое наследование пакетов, как указано в здесь , и столкнулся с проблемой с маршрутами. Я использую аннотации для маршрутизации. Когда я регистрирую свой дочерний пакет в AppKernel.php, все маршруты моих родительских пакетов теряются.

Для того, что я понимаю из документации, Symfony2 должен искать все файлы, включая маршруты, сначала из дочернего пакета, а затем из родительского пакета. Теперь, когда этого не происходит, загружаются только контроллеры дочерних пакетов.

В моем дочернем файле Bundle Buildle я реализовал функцию getParent в соответствии с инструкциями, а в моем routing.yml у меня есть:

ParentBundle:
resource: "@Parent/Controller/"
type:     annotation
prefix:   /admin/

, которая до наследства работала нормально.

Я проверил, что система работает нормально, если включить все файлы контроллера отдельно в routing.yml, но это кажется очень громоздким способом заставить наследование работать, поскольку я хочу переопределить только несколько частей родительского пакета (не все контроллеры) ).

Профилировщик показывает оба моих пакета активными.

Ответы [ 4 ]

18 голосов
/ 10 августа 2012

Я нашел правильное решение для этой проблемы. Сегодня я также пытался переопределить родительский пакет, настроенный с маршрутизацией аннотаций, а также обнаружил, что родительские маршруты игнорировались, если маршрутизация аннотаций импортировала весь пакет ("@ SomeBundle / Controller").

После небольшой отладки я обнаружил, что объяснение этому заключается в том, что, если вы используете «@» в качестве префикса для контроллера, он будет передан распознавателю ядра, который вернет ТОЛЬКО дочерний ресурс, если родительский ресурс был переопределен. Поэтому решение состоит в том, чтобы предоставить полный путь к пакету, учитывая, что ядро ​​будет пытаться сопоставить ресурс из app / Resources , поэтому вам придется добавить относительный каталог (../../) до фактического пути:

# 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

Это будет работать должным образом: все родительские маршруты будут импортированы и будут переопределены всеми маршрутами, указанными в дочернем пакете.

10 голосов
/ 19 апреля 2012

В дополнение к предыдущему ответу мне также пришлось изменить имя routing.yml дочернего пакета (например, на routing_child.yml), чтобы оно заработало. Я предполагаю, что это потому, что Symfony полностью игнорирует файл маршрутизации родительского пакета, если имя идентично.

EDIT: Во многих случаях также целесообразно импортировать маршруты родительского пакета в файл маршрутизации дочернего пакета следующим образом:

# routing_child.yml     
_parent:
    resource: "@MyParentBundle/Resources/config/routing.yml"
2 голосов
/ 25 мая 2012

Официальная документация гласит, что вы должны просто скопировать родительский файл маршрутизации в ваш дочерний пакет:

Самый простой способ "переопределить" маршрутизацию пакета - это вообще никогда не импортировать его. Вместо того, чтобы импортировать маршрутизацию стороннего пакета, просто скопируйте этот файл маршрутизации в ваше приложение, измените его и импортируйте вместо него.

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

P.S. Я надеюсь, что они найдут лучший и менее уродливый способ переопределить и расширить маршрутизацию из родительского пакета, но теперь мы должны найти некоторые из этих уродливых обходных путей.

0 голосов
/ 17 марта 2012

С наследованием пакета вы можете переопределить файлы родительского пакета.

Если вы создаете файл маршрутизации в том же месте, что и родительские элементы в вашем комплекте (если маршрутизация родительского файла находится в ParentBundle / Resources / config / routing.yml, и вы создаете файл маршрутизации в ChildBundle / Resources / config / routing.yml), он переопределит родительский routing.yml, а symfony будет использовать только дочерний routing.yml.

Я не пробовал, но если вы импортируете routing.yml родительского пакета в routing.yml дочернего пакета, вы можете решить вашу проблему. Поскольку маршрутизатор Symfony всегда выбирает первый найденный маршрут, вы можете переопределить нужный маршрут, написав соответствующий код маршрутизации поверх кода импорта.

...