2011-03-14 65 views
2

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

回答

0

它有点棘手,但它可以做到的。 symfony di容器有一个补丁,它允许你将一个已经存在的对象传递给容器构建器实例,并让di容器为你配置它(例如,基于接口注入依赖)。该修补程序在github上的此存储库中实现:https://github.com/lstrojny/symfony但未将其上传到symfony主存储库。

你使用这样的:

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

然后,你可以注册Doctrine's eventmanager进行一餐后的事件处理程序(在这里看到更多的细节:http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html)。在这个事件处理程序中,通过上述方法配置加载的实体。这很明显,但你不能在这种情况下使用构造函数注入,只能使用setter。

设置起来有点棘手,但可以非常强大,特别是与symfony di容器基于接口注入依赖关系的能力相结合。