当我使用参数设置服务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 \监听\ 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");
}
}
任何人都知道为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:5)
您有循环引用。要创建EntityManager,必须首先创建所有事件侦听器。现在,当您的侦听器依赖于依赖于实体管理器的服务时,您将获得循环引用。
修复它的最佳方法是避免创建这些引用 - 您可以通过事件参数将实体管理器传递给侦听器,并传递给它。
另一种方法是将服务容器注入监听器并仅在需要时获取服务。