El objeto evento genérico

Nuevo en la versión 2.1: La clase del evento GenericEvent se añadió en Symfony 2.1.

La clase base Symfony\Component\EventDispatcher\Event proporcionada por el componente Despachador de eventos deliberadamente es escasa para permitir la creación por herencia de la API de objetos Evento específicos usando programación orientada a objetos. Esto permite código elegante y fácil de leer en aplicaciones complejas.

La clase Symfony\Component\EventDispatcher\GenericEvent está disponible por conveniencia para aquellos que quieran utilizar un solo objeto Evento en toda su aplicación. Este es adecuado para la mayoría de los propósitos fuera de la caja, puesto que sigue el patrón observador estándar en el que el objeto evento encapsula el tema de un evento, pero que adicionalmente tiene argumentos opcionales extra.

La clase Symfony\Component\EventDispatcher\GenericEvent tiene una API sencilla, además de la clase base Symfony\Component\EventDispatcher\Event:

El GenericEvent también implementa la clase ArrayAccess en los argumentos del evento, lo cual lo hace muy conveniente para pasar argumentos adicionales relacionados al tema del evento.

Los siguientes ejemplos muestran casos de uso para darte una idea general de su flexibilidad. Los ejemplos asumen que los escuchas de eventos se han añadido al despachador.

Basta con pasar un tema ($subject):

use Symfony\Component\EventDispatcher\GenericEvent;

$event = GenericEvent($subject);
$dispatcher->dispatch('foo', $event);

class FooListener
{
    public function handler(GenericEvent $event)
    {
        if ($event->getSubject() instanceof Foo) {
            // ...
        }
    }
}

Pasando y procesando argumentos usando la API de ArrayAccess para acceder a los argumentos del evento:

use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent(
    $subject,
    array('type' => 'foo', 'counter' => 0)
);
$dispatcher->dispatch('foo', $event);

echo $event['counter'];

class FooListener
{
    public function handler(GenericEvent $event)
    {
        if (isset($event['type']) && $event['type'] === 'foo') {
            // ... hace algo
        }

        $event['counter']++;
    }
}

Filtrando datos:

use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent($subject, array('data' => 'foo'));
$dispatcher->dispatch('foo', $event);

echo $event['data'];

class FooListener
{
    public function filter(GenericEvent $event)
    {
        strtolower($event['data']);
    }
}
Bifúrcame en GitHub