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à