albert
albert

Reputation: 4468

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.

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

Answers (1)

Marius Balčytis
Marius Balčytis

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

Related Questions