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

Oggetto evento generico

Oggetto evento generico

New in version 2.1: La classe GenericEvent è stata aggiunta in Symfony 2.1

La classe base Event fornita dal componente Event Dispatcher è deliberatamente breve, per consentire la creazione di oggetti evento con API specifiche, usando l'ereditarietà. Questo consente un codice elegante e leggibile, anche in applicazioni complesse.

La classe GenericEvent è disponibile per comodità per chi volesse usare un solo oggetto evento in tutta la propria applicazione. È adatta alla maggior parte degli scopi, senza modifiche, perché segue il pattern observer standard, in cui gli oggetti evento incapsulano il soggetto ("subject") di un evento, ma anche alcuni parametri in più.

GenericEvent ha una semplice API, in aggiunta alla classe base Event

  • __construct(): il costruttore accetta il soggetto dell'evento e qualsiasi parametro;
  • getSubject(): restituisce il soggetto;
  • setArg(): imposta un parametro per chiave;
  • setArgs(): imposta un array di parametri;
  • getArg(): restituisce un parametro per chiave;
  • getArgs(): restituisce un array di parametri;
  • hasArg(): restituisce true se il parametro esiste;

GenericEvent implementa anche ArrayAccess sui parametri dell'evento, il che lo rende molto utile per passare parametri ulteriori, che riguardino il soggetto dell'evento.

Gli esempi seguenti mostrano dei casi d'uso, che danno un'idea generale della flessibilità. Gli esempi presumono che gli ascoltatori siano stati aggiunti al distributore di eventi.

Passare semplicemente un soggetto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use Symfony\Component\EventDispatcher\GenericEvent;

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

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

Passare e processare parametri usando l'API ArrayAccess per accedere ai parametri dell'evento:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
use Symfony\Component\EventDispatcher\GenericEvent;

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

echo $event['counter'];

class PippoListener
{
    public function handler(GenericEvent $event)
    {
        if (isset($event['type']) && $event['type'] === 'pippo') {
            // ... fare qualcosa
        }

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

Filtrare i dati:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use Symfony\Component\EventDispatcher\GenericEvent;

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

echo $event['data'];

class PippoListener
{
    public function filter(GenericEvent $event)
    {
        strtolower($event['data']);
    }
}