Как я могу расширить пакет более одного раза? - PullRequest
4 голосов
/ 02 февраля 2012

В моем приложении Symfony2 у меня есть очень простой пакет с именем AnimalsBundle() с очень простой сущностью.

Я могу успешно расширить этот пакет, создав новый пакет MammalsBundle() через Наследование пакетов . Однако невозможно зарегистрировать еще один пакет InsectsBundle(), который также расширяет AnimalsBundle(). Всякий раз, когда я пытаюсь сделать это, Symfony бросает

[LogicException] Комплект "AnimalsTextBundle" напрямую расширяется двумя комплектами "MammalsBundle" и "InsectsBundle".

Так что из коробки это явно не разрешено. Прежде всего, я не совсем уверен, почему это не разрешено, и, что самое важное, как я могу это решить?

Ответы [ 3 ]

2 голосов
/ 06 января 2014

Я знаю, что прошло уже больше года, но я только что натолкнулся на ваш вопрос, и ответ в любом случае может пригодиться кому-то ..

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

AnimalsBundle <| ---- <code>MammalsBundle <| ----- <code>InsectsBundle

Таким образом InsectsBundle косвенноимеет AnimalBundle в качестве родителя и может переопределять файлы из него.

1 голос
/ 30 января 2015

Я знаю, что это было время регистрации, так как вопрос был задан, но для тех, кто нуждается в ответе, я предложу следующее:

1) Старайтесь избегать наследования связки, за исключением случаев, когда вы на 100% уверены, что вам нужно.

2) Учитывая данный пример, лучшая настройка будет выглядеть примерно так: у вас есть CreatureBundle, который состоит в основном из абстрактных классов и интерфейсов. Сделайте так, чтобы каждый потомок связывался с CreatureBundle, и реализуйте каждый Creature специфический код с этими абстрактными классами и интерфейсами в CreatureBundle.

Исходя из личного опыта, я могу сказать, что управлять зависимостями гораздо проще, чем управлять проблемами наследования в случае, если что-то пойдет не так. Если вам когда-нибудь понадобится изменить логику пакета-предка, вы сэкономите много времени, не тратя время на копирование унаследованного кода и изменяя одну и ту же логику в каждом пакете-потомке.

Редактировать: хотя мои предложения могут привести к более тесному взаимодействию и в основном противоречат последнему руководству Symfony по «наилучшим методам» (в котором говорится, что « один пакет на приложение » - это лучший метод), в конце концов, вы Вы поймете, что этот подход в конечном итоге облегчает обслуживание кода.

0 голосов
/ 02 февраля 2012

Я не могу вспомнить случай использования, когда вам, возможно, понадобится это сделать. Пакеты должны быть похожи на отдельные приложения. У вас есть контейнер для ввода зависимостей, если вам нужны ресурсы из другого пакета.

Возможно, вам следует пересмотреть структуру вашего проекта.

...