Contenedor consciente del despachador de eventos

Nuevo en la versión 2.1: Esta característica se movió al componente EventDispatcher en Symfony 2.1.

Introducción

La clase Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher es una implementación especial del despachador de eventos que es conectada al contenedor del servicio que forma parte del componente de Inyección de dependencias. Esto te permite especificar servicios como escuchas de evento volviendo extremadamente potente al despachador de eventos.

Los servicios se cargan de manera diferida, lo cual significa que los servicios adjuntos como escuchas sólo se crearán si se despacha un evento que requiere de esos escuchas.

Configurando

La instalación es sencilla inyectando una Symfony\Component\DependencyInjection\ContainerInterface en Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher:

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;

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

Añadiendo escuchas

El contenedor consciente del despachador de eventos puede cargar determinados servicios directamente, o servicios que implementan la Symfony\Component\EventDispatcher\EventSubscriberInterface.

Los siguientes ejemplos asumen que el contenedor de servicios se ha cargado con algunos servicios ya mencionados.

Nota

Los servicios se tienen que marcar como públicos en el contenedor.

Agregando servicios

Para conectar las definiciones de servicios existentes, usa el método addListenerService() dónde $callback es un arreglo de array($serviceId, $methodName):

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

Agregando suscriptores de servicios

Puedes agregar EventSubscribers usando el método addSubscriberService() dónde el primer argumento es el identificador del suscriptor del servicio, y el segundo argumento es el nombre de la clase del servicio (el cual debe implementar la Symfony\Component\EventDispatcher\EventSubscriberInterface) de la siguiente manera:

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

La EventSubscriberInterface será exactamente como era de esperar:

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
// ...

class StoreSubscriber implements EventSubscriberInterface
{
    public static 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)
    {
        // ...
    }
}
Bifúrcame en GitHub