Reputation: 4468
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?
Upvotes: 1
Views: 737
Reputation: 2651
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.
Upvotes: 5