如何多次扩展捆绑包?

时间:2012-02-02 09:11:46

标签: exception inheritance symfony bundle

在我的Symfony2应用程序中,我有一个名为AnimalsBundle()的非常基本的包,其中包含一个非常基本的实体。

我可以通过Bundle Inheritance创建新的包MammalsBundle()来成功扩展此捆绑包。但是,无法注册另一个也扩展InsectsBundle()的捆绑AnimalsBundle()。每当我想要这样做时,Symfony会抛出一个

  

[LogicException]    Bundle“AnimalsTextBundle”由两个捆绑“MammalsBundle”和“InsectsBundle”直接扩展。

开箱即用,显然是不允许的。首先,我不确定为什么不允许这样做 - 最重要的是 - 我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:2)

我知道现在已经超过了一年,但我刚刚遇到了你的问题,答案可能对某人有用..

Symfony不允许捆绑包直接由多个捆绑包扩展,只是因为如果两个捆绑包覆盖相同的文件,则无法确定应该使用哪个捆绑包。但是,您可以通过执行以下操作来实现您的目标:

AnimalsBundle< | ---- MammalsBundle< | ----- InsectsBundle

这样InsectsBundle间接将AnimalBundle作为父级,并可以覆盖它的文件。

答案 1 :(得分:1)

我知道,自提出问题以来这是一个记录时间,但对于那些需要答案的人,我建议如下:

1)尽量避免使用bundle继承,除非你需要100%肯定的情况。

2)鉴于有问题的例子,更好的设置看起来像这样:你有一个CreatureBundle,它主要由抽象类和接口组成。使每个后代包依赖于CreatureBundle,并使用Creature中的那些抽象类和接口实现每个CreatureBundle特定代码。

根据个人经验,我可以看出,管理依赖项比管理继承问题要容易得多。如果您需要更改祖先捆绑的逻辑,那么您不必通过挖掘继承的代码并在每个后代捆绑中更改相同的逻辑来节省自己的时间。

编辑:虽然我的建议可能导致更紧密的耦合,但基本上与最新的Symfony的最佳实践相矛盾。指南(其中指出' 每个应用的单个捆绑包'是最佳做法),最后您会意识到这种方法最终会使代码维护变得更容易。

答案 2 :(得分:-1)

我无法想到您可能需要这样做的用例。捆绑包几乎就像独立的应用程序。如果您需要来自另一个捆绑包的资源,则可以使用依赖注入容器。

也许您应该重新考虑您的项目结构。