Creative Commons License
This work is licensed under a
Creative Commons
Attribution-Share Alike 3.0
Unported License.

Master Symfony2 fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Symfony hosting done right

ServerGrove, outstanding support at the right price for your Symfony hosting needs.
servergrove.com

Discover the SensioLabs Support

Access to the SensioLabs Competency Center for an exclusive and tailor-made support on Symfony
sensiolabs.com

Le Répartiteur d'évènement du Container Aware

Le Répartiteur d'évènement du Container Aware

New in version 2.1: Cette fonctionnalité a été déplacée dans l'« EventDispatcher » dans Symfony 2.1.

Introduction

La classe ContainerAwareEventDispatcher est une implémentation spéciale du répartiteur d'évènement qui est couplé au conteneur de services qui fait partie du composant d'Injection de Dépendance. Il permet aux services d'être spécifiés en tant que « listeners » d'évènement rendant le répartiteur d'évènement extrêmement puissant.

Les services sont chargés de manière fainéante (« lazy loading » en anglais), ce qui signifie que les services attachés en tant que « listeners » ne seront créés que si un évènement qui est réparti nécessite ces « listeners ».

Installation

L'installation est très facile et nécessite uniquement l'injection d'une interface ContainerInterface dans la classe ContainerAwareEventDispatcher:

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

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

Ajouter des « Listeners »

Le Répartiteur d'Évènement du Container Aware peut soit directement charger des services spécifiques, soit des services qui implémentent EventSubscriberInterface.

Les exemples suivants supposent que le conteneur de services a été chargé avec tous les services qui sont mentionnés.

Note

Les services doivent être marqués comme publics dans le conteneur.

Ajouter des services

Pour connecter des définitions de service existantes, utilisez la méthode addListenerService() où le $callback est un tableau de array($serviceId, $methodName):

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

Ajouter des services souscripteurs

Les « EventSubscribers » peuvent être ajoutés en utilisant la méthode addSubscriberService() où le premier argument est l'ID du service souscripteur, et où le second argument est le nom de la classe du service (qui doit implémenter EventSubscriberInterface) comme suit:

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

L'EventSubscriberInterface va ressembler exactement à ce à quoi vous vous attendez:

 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
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
// ...

class StoreSubscriber implements EventSubscriberInterface
{
    static public function getSubscribedEvents()
    {
        return array(
            'kernel.response' => array(
                array('onKernelResponsePre', 10),
                array('onKernelResponsePost', 0),
            ),
            'store.order'     => array('onStoreOrder', 0),
        );
    }

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

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

    public function onStoreOrder(FilterOrderEvent $event)
    {
        // ...
    }
}