Come utilizzare gli eventi in WinterCMS - Parte 2

Luca Benati

Impariamo a sfruttare i listener della classe Event con October Winter - Parte 2


Pubblicato da Luca Benati il 21 gennaio 2022

Questo articolo è la seconda parte di una serie di articoli che ci aiuteranno a capire meglio come funzionano e come utilizzare gli eventi nelle nostre applicazioni sviluppate con WinterCMS.

Sottoscrizione con priorità

Riprendendo da dove eravamo rimasti nella prima parte di questa serie di articoli sull'uso degli eventi possiamo passare al listener dell'evento un terzo parametro di tipo numerico che rappresenta la priorità di esecuzione, più il numero è alto più sarà alta la sua priorità di esecuzione, a parità di priorità verranno eseguiti in oridne di sottoscrizione.



// Eseguito per primo
Event::listen('auth.login', function() { ... }, 10);

// Eseguito per secondo
Event::listen('auth.login', function() { ... }, 5);

Listener bloccanti

In alcuni casi si potrebbe volere di interrompere la propagazione degli eventi in determinate situazioni, è possibile fare questo facendo ritornare false al listner



Event::listen('auth.login', function($event) {
    // Gestione dell'evento
    return false;
});

Listener jolly

Quando registri un event listener puoi usare il carattere asterisco(*) per specificare un listener jolly che riceverà come primo parametro il nome dell'evento lanciato.

Ad esempio il listener qui di seguito gestirà tutti gli eventi che cominciano per "wnitalia"


Event::listen('wnitalia.*', function($event, $params) {
   // Gestione dell'evento
});

All'interno del lister jolly è possibile determinare l'evento preciso che è stato lanciato tramite il metodo Event::firing


Event::listen('wnitalia.*', function($event, $params) {
    if (Event::firing() === 'wnitalia.evento') {
        // Gestione dell'evento
    }
});

Lanciare eventi

You may use the Event::fire method anywhere in your code to make the logic extensible. This means other developers, or even your own internal code, can "hook" to this point of code and inject specific logic. The first argument of should be the event name.

È possibile usare il metodo Eventi::fire ovuncque nel tuo codice per rendere la tua logica estensibile, questo permetterà agli altri sviluppatori o all'interno del tuo stesso codice "agganciarsi" in un determinato punto del tuo codice ed iniettarvi della logica specifica, il primo argomento del metodo è il nome dell'evento


Event::fire('mioevento')

Ma visto che è sempre un'ottima cosa usare come prefisso il namespace del nostro plugin per evitare collisioni lo andremo a scrivere così


Event::fire('wnitalia.mioplugin.mioevento')

Il secondo argomento è un array di valori che saranno passati come argomenti al listener dell'evento che lo sottoscrive.


Event::fire('wnitalia.mioplugin.mioevento', [$arg1, $arg2]);

Il terzo argomento specifica se l'evento deve essere un evento di arresto, il che significa che dovrebbe interrompersi se viene restituito un valore "non null", per impostazione predefinita questo argomento è impostato su false.


Event::fire('wnitalia.mioplugin.mioevento', [...], true);

Se è un evento di arresto il primo valore ritornato sarà catturato


// singolo risultato, evento arrestato
$result = Event::fire('wnitalia.mioplugin.mioevento', [...], true);

Altrimento ritornerà una collezione di tutte le risposte da parte di tutti gli eventi sotto fomra di array


// Risultato multiplo, tutti i listener sono stati eseguiti
$results = Event::fire('wnitalia.mioplugin.mioevento', [...]);

Passare gli argomenti per referenza

Quando si elabora o si filtra un valore passato a un evento, è possibile anteporre alla variabile "&" per passarla per riferimento. Ciò consente a più listener di manipolare il risultato e passarlo a quello successivo.


Event::fire('wnitalia.blog.elaboracontenuto', [&$contenuto])

Quando siamo in ascolto di un evento che passa un argomento per referenza, l'argomento deve essere dichiarato con il simbolo "&" anche nella definizione della clousure.

Nell'esempio seguente, la variabile $content avrà "WinterCMS-Italia" aggiunto al risultato.


Event::listen('wnitalia.blog.elaboracontenuto', function (&$contenuto) {
    $contenuto = $contenuto . 'WinterCMS';
});

Event::listen('wnitalia.blog.elaboracontenuto', function (&$contenuto) {
    $contenuto = $contenuto . '-Italia';
});

Accodare gli eventi

Gli eventi di attivazione possono essere posticipati utilizzando le code. Utilizzare il metodo Event::queue per "accodare" l'evento per l'attivazione ma senza lanciarlo immediatamente.


Event::queue('wnitalia.mioplugin.mioevento', [$argomento]);

È possibile utilizzare il metodo Event::flush per svuotare tutti gli eventi in coda


Event::flush('wnitalia.mioplugin.mioevento')

Happy coding!


Vedi gli altri articoli della serie


Lunga vita e prosperità

Ti interessa un argomento non trattato?