Come utilizzare gli eventi in WinterCMS - Parte 1

Luca Benati

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


Pubblicato da Luca Benati il 08 aprile 2021

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à

Ti interessa un argomento non trattato?