Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is symfony2 not calling my event listeners?

Tags:

php

symfony

I have a program with two bundles. One of them (CommonBundle) dispatches an event "common.add_channel", while a service on the other one (FetcherBundle) was supposed to be listening to it. On the profiler, I can see the event common.add_channel in the "Not Called Listeners" section. I don't get why symfony is not registering my listener.

This is my action, inside CommonBundle\Controller\ChannelController::createAction:

$dispatcher = new EventDispatcher();
$event = new AddChannelEvent($entity);        
$dispatcher->dispatch("common.add_channel", $event);

This is my AddChannelEvent:

<?php

namespace Naroga\Reader\CommonBundle\Event;

use Symfony\Component\EventDispatcher\Event;
use Naroga\Reader\CommonBundle\Entity\Channel;

class AddChannelEvent extends Event {

    protected $_channel;

    public function __construct(Channel $channel) {
        $this->_channel = $channel;
    }

    public function getChannel() {
        return $this->_channel;
    }

}

This was supposed to be my listener (FetcherService.php):

<?php

namespace Naroga\Reader\FetcherBundle\Service;

class FetcherService {

    public function onAddChannel(AddChannelEvent $event) {
        die("It's here!");      
    }
}

And here's where I register my listener (services.yml):

kernel.listener.add_channel:
    class: Naroga\Reader\FetcherBundle\Service\FetcherService
    tags:
        - { name: kernel.event_listener, event: common.add_channel, method: onAddChannel }

What am I doing wrong? Why isn't symfony calling the event listener when I dispatch common.add_channel?

like image 289
Pedro Cordeiro Avatar asked Apr 05 '13 19:04

Pedro Cordeiro


1 Answers

The new event dispatcher doesn't know anything about the listeners set on another dispatcher.

In your controller, you need to access the event_dispatcher service. A Compiler Pass of the Framework Bundle attached all listeners to this dispatcher. To get the service, use the Controller#get() shortcut:

// ...
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class ChannelController extends Controller
{
    public function createAction()
    {
        $dispatcher = $this->get('event_dispatcher');
        // ...
    }
}
like image 58
Wouter J Avatar answered Oct 14 '22 02:10

Wouter J