简体   繁体   English

使用带参数的服务时,标记为doctrine.event_subscriber的symfony2服务未接收事件

[英]symfony2 service tagged as doctrine.event_subscriber not receiving events when using service with arguments

When I setup the service sme_task.listener.status_change with arguments it is not receiving events. 当我使用参数设置服务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 }

If I remove the arguments the event is reached. 如果我删除参数,则事件已到达。

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

Sme\\TaskBundle\\Listener\\StatusChangeListener.php 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");
    }
}

Anyone have an idea why this happens and how I can fix it? 任何人都知道为什么会发生这种情况以及如何解决它?

You have circular references. 您有循环引用。 To create EntityManager, all event listeners must be created first. 要创建EntityManager,必须首先创建所有事件侦听器。 Now as your listener has dependency on a service, which has dependency on entity manager, you get circular reference. 现在,由于侦听器依赖于服务(依赖于实体管理器),因此可以得到循环引用。

Best way to fix it would be avoid creating these references - you can get entity manager to listener by event arguments, passed to it. 解决此问题的最佳方法是避免创建这些引用-您可以通过传递给它的事件参数来使实体管理器成为侦听器。

Another way would be to inject service container into listener and get the service only when it's needed. 另一种方法是将服务容器注入侦听器,并仅在需要时获取服务。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM