1

当我使用参数设置服务 sme_task.listener.status_change 时,它​​没有接收到事件。

services:
    sme_task.service.task_template:
        class: Sme\TaskBundle\Service\TaskTemplateService
        arguments: [@doctrine.orm.entity_manager]

    sme_task.listener.status_change:
        class: Sme\TaskBundle\Listener\StatusChangeListener
        arguments: ["@sme_task.service.task_template"]
        tags:
            - { name: doctrine.event_subscriber, connection: default }

如果我删除参数,事件就会到达。

    sme_task.listener.status_change:
        class: Sme\TaskBundle\Listener\StatusChangeListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }

Sme\TaskBundle\Listener\StatusChangeListener.php

class StatusChangeListener implements EventSubscriber {
    private $taskTemplateService;
    public function __construct($taskTemplate=null) {

        $this->taskTemplateService=$taskTemplate;
    }

[...]

    public function onFlush(OnFlushEventArgs  $eventArgs) {
        throw new \Exception("Event reached");
        [... some calls to TaskTemplateService ...]
    }

    function getSubscribedEvents()
    {
        return array("onFlush");
    }
}

任何人都知道为什么会发生这种情况以及我该如何解决?

4

1 回答 1

5

你有循环引用。要创建 EntityManager,必须首先创建所有事件侦听器。现在,由于您的侦听器依赖于依赖于实体管理器的服务,因此您将获得循环引用。

修复它的最佳方法是避免创建这些引用 - 您可以通过传递给它的事件参数让实体管理器监听。

另一种方法是将服务容器注入侦听器并仅在需要时获取服务。

于 2013-09-06T20:48:23.130 回答