Symfony DIC и родительские службы не работают - PullRequest
3 голосов
/ 12 марта 2012

Я интегрирую Symfony DIC в приложение Zend Framework, и это нормально, за исключением родительских сервисов.

В моей конфигурации DIC у меня есть родительский сервис PC_Service, который будет расширен всеми моими сервисами.Проблема заключается в том, что диспетчер сущностей недоступен (NULL) в службах, расширяющих PC_Service.Когда я внедряю управляющий объект через service.stats, управляющий объект устанавливается правильно.

...
<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 ]

1 голос
/ 12 марта 2012

Не знаю, является ли это опечаткой, но это должно быть doctrine.orm.default_entity_manager или doctrine.orm.entity_manager (псевдоним предыдущих версий):

<service id="pc.service" class="PC_Service" abstract="true">
    <call method="setEntityManager">
        <argument type="service" id="doctrine.orm.default_entity_manager" />
    </call>
</service>
0 голосов
/ 19 мая 2012

Решение состоит в том, чтобы скомпилировать сервисный контейнер в конце начальной загрузки ZF. Этот процесс имеет шаг с именем ResolveDefinitionTemplatesPass, который исправляет вызовы от родительских служб.

Обычно это делается ядром Symfony , но, конечно, его нет в интеграции 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();
}
...