使用Symfony DI容器的原则2

时间:2011-03-14 06:49:48

标签: symfony dependency-injection doctrine-orm

我正在开发一个利用Doctrine 2的Zend Framework项目。我正在尝试让Symfony的DI容器与该项目一起工作,但我遇到了麻烦。假设我有一个类“Foo”需要注入两个实例。我可以设置一个Symfony DI容器,没有问题,可以通过注入依赖项来获取新的“Foo”。大!但是现在如果我想让“Foo”成为一个学说实体呢?当我将实体插入数据库时​​,一切都很好,因为我可以从DI容器中获取一个新实体并简单地保留实体。但是,当我从DB Doctrine查询实体时,实例化我的“Foo”实例并且它们将没有注入适当的依赖项。如何让Doctrine使用我的DI容器,以便实体具有适当的依赖关系?我知道Doctrine提供了一个“postLoad”钩子,我可以使用它来为我的实体注入依赖关系,但这种做法会破坏DI容器的目的和好处。

2 个答案:

答案 0 :(得分:4)

Doctrine Entity是一个新手,而不是一个可注射的。实体不应该通过DIC创建。请参阅以下关于newable和injectable之间差异的博文:

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

答案 1 :(得分:0)

它有点棘手,但可以做到。 symfony di容器存在一个补丁,它允许您将已存在的对象传递给容器构建器实例,并让di容器为您配置它(例如,根据接口注入依赖关系)。该补丁在github:https://github.com/lstrojny/symfony上的这个存储库中实现,但没有使它成为symfony主存储库的上游。

你这样使用它:

$user = new User();
$container->configure('someId', $user);

然后您可以使用Doctrine的EventManager注册PostLoad事件处理程序(有关详细信息,请参阅此处:http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html)。在此事件处理程序中,您可以通过上述方法配置加载的实体。很明显但在这种情况下你不能使用构造函数注入,只能使用setter。

设置起来有点棘手,但可以非常强大,特别是结合symfony di容器根据接口注入依赖项的能力。