Questo articolo è la prima 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.
Utilizzo base
La classe Event fornisce una semplice implementazione del pattern Observer che ci permette di sottoscrivere un listener che esegua del codice nel momento in cui l'evento che stiamo ascoltando viene chiamato.
Per fare questo basterà sfruttare il metodo Event::listen passando come primo argomento il nome dell'evento del quale vogliamo rimanere in ascolto e come secondo argomento una Clousure che verrrà esguita quando l'evento specificato verrà attuato.
Ad esempio se usiamo il plugin Winter.User per la gestione utenti di frontend e volessimo salvare nel log di sistema gli utenti quando accedono dovremo scrivere
Event::listen('winter.user.login', function ($user) {
Log::info(sprintf("Ha effettuato l'accesso %s", $user->name));
});
Questo evento viene reso disponibile dal metodo Event::fire che viene chiamato dalla logica di login degli utenti di frontend dal plugin, in questo caso specifico l'evento lo si trova insieme agli altri nella documentazione del plugin stesso visibile a questa pagina e andando a leggere il codice del controller troviamo il punto in cui viene scatenato l'evento a questa riga
Gli eventi di sistema di WinterCMS si trovano nella documentazione a questa pagina della documentazione
Come puoi notare alla Clousure viene passato un argomento che in questo caso è un istanza della classe Winter\User\Models\User, infatti come visto nel controller viene passato $this che rappresenta l'istanza corrente dell'utente loggato
...
Event::fire('winter.user.login', [$this]);
...
Oltre che una clousure possiamo passare al listener anche un metodo di classe, ad esempio
Event::listen('winter.user.login', [$this, 'loggaAccessoUtente']);
quindi avremo di conseguenza un metodo nella classe chiamato loggaAccessoUtente che conterrà il codice da eseguire
public function loggaAccessoUtente($user)
{
Log::info(sprintf("Ha effettuato l'accesso %s", $user->name));
}
Il metodo di classe può utilizzare tutti, alcuni o nessuno degli argomenti messi a disposizione dall'evento ma non verrà alzata nessuna eccezione se non quando ne vengono specificati più di quelli disponibili.
Dove registrare i listeners
Normalmente i listener vengono registrati nel metodo boot() nel file di registrazione del plugin Plugin.php
class MioPlugin extends PluginBase
{
public function boot()
{
Event::listen('winter.user.login', function ($user) {
Log::info(sprintf("Ha effettuato l'accesso %s", $user->name));
});
}
}
In alternativa è possibile creare un file denominato Init.php nella root del nostro plugin dove possiamo registrare tutte le logiche di registrazione dei listeners
Event::listen('winter.user.login', function ($user) {
Log::info(sprintf("Ha effettuato l'accesso %s", $user->name));
});
...
Entrambi i metodi sono corretti, la scelta generalmente cade sul metodo col quale ci troviamo meglio e dalle dimensioni dell'applicazione che stiamo scrivendo.
Per ora è tutto, approfondiremo altri aspetti nel prossimo articolo.
Happy coding!
Vedi gli altri articoli della serie
Lunga vita e prosperità