duanqianhuan3994 2013-09-06 06:18
浏览 39
已采纳

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

When I setup the service sme_task.listener.status_change with arguments it is not receiving events.

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

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?

展开全部

  • 写回答

1条回答 默认 最新

  • dongshuobei1037 2013-09-06 12:48
    关注

    You have circular references. To create EntityManager, all event listeners must be created first. 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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部