Cosa sono gli eventi
Il sistema di eventi di Laravel è una semplice implementazione del pattern Observer. Emettendo eventi che rappresentano cose accadute nell’applicazione e definendo listener che vi reagiscono, riduci al minimo le dipendenze tra i componenti. Ad esempio, quando emetti l’evento “ordine confermato”, più listener come “invia email di conferma”, “riduci lo stock” e “notifica Slack” operano indipendentemente. Il codice dell’ordine non deve sapere nulla di email o notifiche Slack.Le classi evento vanno in
app/Events, i listener in app/Listeners.
Se queste directory non esistono, i comandi Artisan le creano automaticamente.Creazione di eventi e listener
Conmake:event e make:listener generi gli scheletri.
Registrazione degli eventi
Event discovery (rilevamento automatico)
Di default Laravel scansiona la directoryapp/Listeners e registra i listener automaticamente.
Deduce la mappatura evento-listener dal tipo dell’argomento del metodo handle o __invoke.
bootstrap/app.php.
Registrazione manuale
Puoi registrare manualmente con la facadeEvent in boot di AppServiceProvider.
Definizione degli eventi
Le classi evento sono contenitori di dati: non hanno logica, mantengono solo informazioni sotto forma di proprietà.SerializesModels gestisce correttamente la serializzazione dei modelli Eloquent quando i listener in coda serializzano l’evento.
Emissione degli eventi
Emetti con il metodo staticodispatch o con l’helper event().
Emissione dopo il commit della transazione
Se vuoi emettere l’evento solo dopo il commit di una transazione, implementa l’interfacciaShouldDispatchAfterCommit sull’evento.
Se la transazione fallisce l’evento viene scartato.
Implementazione dei listener
Il listener riceve l’evento nel metodohandle.
Nel costruttore, il service container inietta automaticamente le dipendenze.
false dal metodo handle interrompi la propagazione ai listener successivi.
Listener in coda
Le operazioni lente (invio email, chiamate HTTP) possono essere eseguite in modo asincrono come listener in coda. Implementa l’interfacciaShouldQueue e all’emissione dell’evento il listener finisce automaticamente in coda.
Prima di usare listener in coda serve la configurazione delle code e l’avvio del worker.
Consulta Code e job.
Personalizzare connection, nome coda e delay
Con gli attribute PHP puoi impostare connection, nome coda e delay.Numero massimo di tentativi e timeout
Con#[Tries] e #[Timeout] controlli il comportamento in caso di fallimento.
Gestione dei fallimenti
Definendo il metodofailed puoi gestire il post-fallimento dopo il numero massimo di tentativi.
Event subscriber
Un subscriber raccoglie in un’unica classe più handler correlati.Creazione del subscriber
Nel metodosubscribe restituisci un array che mappa eventi a handler.
Registrazione del subscriber
Con l’event discovery attivo, i subscriber che restituiscono un array dasubscribe vengono registrati automaticamente.
Per registrarlo manualmente usa Event::subscribe in boot di AppServiceProvider.
Esempio pratico: invio di email di benvenuto alla registrazione
1
Crea la classe evento
app/Events/UserRegistered.php per mantenere l’utente registrato.2
Crea la classe listener
ShouldQueue.3
Emetti l'evento nel controller
Dopo la registrazione dell’utente, invoca
UserRegistered::dispatch().RegisterController emette solo l’evento UserRegistered senza sapere nulla dell’invio email.
In futuro, aggiungere anche una notifica Slack non richiederà modifiche al controller.4
Avvia il worker
Avvia il worker per elaborare i listener in coda.