具有Symfony DI容器的原则2

具有Symfony DI容器的原则2,symfony,dependency-injection,doctrine-orm,Symfony,Dependency Injection,Doctrine Orm,我正在从事一个利用条令2的Zend框架项目。我试图让Symfony的DI容器也与项目一起工作,但我遇到了麻烦。假设我有一个需要注入两个实例的类“Foo”。我可以设置一个symfonydi容器,毫无问题地为我获取一个带有注入依赖项的新“Foo”。伟大的但是现在如果我想让“Foo”成为一个教义实体呢?当我将实体插入数据库时,一切都很好,因为我可以从DI容器中获取一个新的实体并简单地持久化该实体。但是,当我从DB中查询实体时,Doctrine正在实例化我的“Foo”实例,它们将不会注入正确的依赖项。我

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

Doctrine实体是一个新的,而不是一个可注入的。实体不应通过DIC创建。关于可更新和可注入之间的区别,请参阅以下博文:


这有点棘手,但可以做到。symfony di容器有一个补丁,它允许您将一个已经存在的对象传递给容器生成器实例,并让di容器为您配置它(例如,基于接口注入依赖项)。该补丁是在github上的这个存储库中实现的:但是没有将它放到symfony主存储库的上游

您可以这样使用它:

$user = new User();
$container->configure('someId', $user);
然后,您可以向Doctrine的EventManager注册后加载事件处理程序(有关更多详细信息,请参阅此处:)。在此事件处理程序中,您可以通过上述方法配置加载的实体。这很明显,但在这种情况下不能使用构造函数注入,只能使用setter

这在设置上有点棘手,但可能非常强大,特别是结合symfonydi容器基于接口注入依赖项的能力