我正在将Zemfic DIC集成到zend框架应用程序中,除了父服务之外,这种情况很好。
在我的DIC配置中,我有一个父服务PC_Service,它将由我的所有服务扩展。 问题是实体管理器在扩展PC_Service的服务中不可用(NULL)。当我通过service.stats注入entitymanager时,实体设置正确。
...
<service id="pc.service" class="PC_Service" abstract="true">
<call method="setEntityManager">
<argument type="service" id="doctrine.entitymanager" />
</call>
</service>
...
<service id="service.stats" class="Application_Service_Stats" parent="pc.service" />
...
PC_Service
abstract class PC_Service
{
protected $_em;
public function setEntityManager($entityManager)
{
$this->_em = $entityManager;
}
}
Application_Service_Stats
class Application_Service_Stats extends PC_Service
{
... $this->_em should be set here.
}
我希望有人可以告诉我我做错了什么。
答案 0 :(得分:1)
不知道这是不是一个错字,但它应该是doctrine.orm.default_entity_manager
或doctrine.orm.entity_manager
(previuos的别名):
<service id="pc.service" class="PC_Service" abstract="true">
<call method="setEntityManager">
<argument type="service" id="doctrine.orm.default_entity_manager" />
</call>
</service>
答案 1 :(得分:-1)
解决方案是在ZF引导程序末尾附近编译服务容器。此过程有一个名为ResolveDefinitionTemplatesPass
的步骤,用于修补来自父服务的调用。
这通常由Symfony Kernel完成,但当然在ZF集成中不存在。
protected function _initServiceContainerCompilation()
{
// Wait for the SC to get built
$this->bootstrap('Services');
// Doctrine modifies the SC, so we need to wait for it also
$this->bootstrap('Doctrine');
// Compiling the SC allows "ResolveDefinitionTemplatesPass" to run,
// allowing services to inherit method calls from parents
$sc = $this->getResource('Services');
$sc->compile();
}