2

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

4

2 回答 2

4

Doctrine Entity 是新的,而不是可注射的。实体不应通过 DIC 创建。请参阅以下博客文章,了解 newable 和 injectionable 之间的区别:

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

于 2011-03-14T12:35:37.080 回答
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 容器基于接口注入依赖项的能力。

于 2011-03-15T20:46:11.247 回答