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