Skip to content

The Container Aware Event Dispatcher

Warning: You are browsing the documentation for Symfony 3.x, which is no longer maintained.

Read the updated version of this page for Symfony 7.1 (the current stable version).

3.3

The ContainerAwareEventDispatcher class has been deprecated in Symfony 3.3 and will be removed in Symfony 4.0. Use EventDispatcher with closure-proxy injection instead.

Introduction

The ContainerAwareEventDispatcher is a special EventDispatcher implementation which is coupled to the service container that is part of the DependencyInjection component. It allows services to be specified as event listeners making the EventDispatcher extremely powerful.

Services are lazy loaded meaning the services attached as listeners will only be created if an event is dispatched that requires those listeners.

Setup

Setup is straightforward by injecting a ContainerInterface into the ContainerAwareEventDispatcher:

1
2
3
4
5
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;

$containerBuilder = new ContainerBuilder();
$dispatcher = new ContainerAwareEventDispatcher($containerBuilder);

Adding Listeners

The ContainerAwareEventDispatcher can either load specified services directly or services that implement EventSubscriberInterface.

The following examples assume the service container has been loaded with any services that are mentioned.

Note

Services must be marked as public in the container.

Adding Services

To connect existing service definitions, use the addListenerService() method where the $callback is an array of [$serviceId, $methodName]:

1
$dispatcher->addListenerService($eventName, ['foo', 'logListener']);

Adding Subscriber Services

Event subscribers can be added using the addSubscriberService() method where the first argument is the service ID of the subscriber service, and the second argument is the service's class name (which must implement EventSubscriberInterface) as follows:

1
2
3
4
$dispatcher->addSubscriberService(
    'kernel.store_subscriber',
    'StoreSubscriber'
);

The EventSubscriberInterface is exactly as you would expect:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
// ...

class StoreSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::RESPONSE => [
                ['onKernelResponsePre', 10],
                ['onKernelResponsePost', 0],
            ),
            'store.order' => ['onStoreOrder', 0],
        );
    }

    public function onKernelResponsePre(FilterResponseEvent $event)
    {
        // ...
    }

    public function onKernelResponsePost(FilterResponseEvent $event)
    {
        // ...
    }

    public function onStoreOrder(FilterOrderEvent $event)
    {
        // ...
    }
}
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.
TOC
    Version