2012-02-02 44 views
4

在我的Symfony2应用程序中,我使用了一个非常基本的实体,名为AnimalsBundle()如何多次扩展一个包?

我能成功地通过Bundle Inheritance创建一个新的捆绑MammalsBundle()扩展这个包。但是,不可能再注册一个还扩展了AnimalsBundle()的捆绑InsectsBundle()。每当我试图做到这一点,Symfony的抛出一个

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

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

回答

2

我知道它已经超过一年多了,但我只是碰到你的问题,反正答案的人也许有用来到..

的Symfony不允许包被一个以上的束直接延伸,因为如果两个bundle重写相同的文件,就不可能确定应该使用哪个bundle。然而,你可以达到你想要的东西通过执行以下操作:

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

这样InsectsBundle间接拥有AnimalBundle作为父母,可以从覆盖文件它。

+0

谢谢,这可能不是最完美的解决方案,但只要多BundleInheritance不工作(是的,你的解释是有道理的),这似乎是唯一的出路。 – acme 2014-01-10 09:50:13

+0

当你想想看,它实际上是非常符合逻辑的。我想以不同的方式继承一个包,不止一次。但它只是为了覆盖父包而已。 – axelvnk 2015-06-23 15:05:19

-1

我想不出一个使用情况下你可能需要这样做的。捆绑包意味着几乎像独立应用程序。如果您需要其他软件包的资源,则可以使用依赖注入容器。

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

+0

我想因为孩子捆绑使用最多的功能,但应该能够覆盖的行为有些其父包的功能(如控制器或在其替代一类通过简单地把一个文件具有相同名称的继承束进入子包或扩展实体)。我不知道什么方法是正确的。 – acme 2012-02-02 14:08:45

+0

您仍然可以使用标准的PHP对象的继承车型,控制器等我会使用捆绑的继承将覆盖嫩枝模板的唯一原因 - 但即使是这样,也有围绕它的方式。 – leek 2012-02-02 15:14:51

+0

有趣的是,我正是想覆盖的树枝模板,为每个包一个differente错误页面,但我得到这个错误。还有什么其他方式? – Julien 2012-11-08 14:47:48

1

我知道,这一直是一个日志的时间,因为这个问题已经被问过,但对于那些需要一个答案,我会建议如下:

1)尽量避免除案件束继承你需要100%肯定。

2)考虑到这个例子,更好的设置看起来像这样:你有一个CreatureBundle,它主要由抽象类和接口组成。使每个后代束取决于CreatureBundle和实施CreatureBundle与抽象类和接口的每个Creature特定的代码。

根据个人的经验,我可以告诉大家,管理依赖比的情况下,一些管理问题的继承更容易的任务出错。如果你永远需要改变祖先包的逻辑,那么你就不用挖掘继承的代码并改变每个后代包中的相同逻辑,从而节省大量时间。

编辑:虽然我的建议可能导致更紧密的耦合,基本上违背了最新的Symfony的“最佳实践”指南(其中规定,“每个应用单束”是一种最佳实践),最终你就会明白,这种方法最终使代码维护更容易。

相关问题