Symfony DIC和家长服务无法正常工作

时间:2012-03-12 06:09:24

标签: zend-framework dependency-injection symfony

我正在将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.
}

我希望有人可以告诉我我做错了什么。

2 个答案:

答案 0 :(得分:1)

不知道这是不是一个错字,但它应该是doctrine.orm.default_entity_managerdoctrine.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();
}