Skip to main content

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

Con make:event e make:listener generi gli scheletri.
Senza argomenti vengono chiesti interattivamente.

Registrazione degli eventi

Event discovery (rilevamento automatico)

Di default Laravel scansiona la directory app/Listeners e registra i listener automaticamente. Deduce la mappatura evento-listener dal tipo dell’argomento del metodo handle o __invoke.
Con i tipi union di PHP puoi ricevere più eventi in un unico metodo.
Per posizionare i listener in altre directory, indica ulteriori path di scansione in bootstrap/app.php.
Con i wildcard puoi indicare più directory.
Elenca i listener registrati con:
In produzione conviene cachare il manifest dei listener. Al deploy esegui php artisan optimize o php artisan event:cache. Per svuotare la cache usa php artisan event:clear.

Registrazione manuale

Puoi registrare manualmente con la facade Event in boot di AppServiceProvider.
Puoi anche usare una closure.

Definizione degli eventi

Le classi evento sono contenitori di dati: non hanno logica, mantengono solo informazioni sotto forma di proprietà.
Il trait SerializesModels gestisce correttamente la serializzazione dei modelli Eloquent quando i listener in coda serializzano l’evento.

Emissione degli eventi

Emetti con il metodo statico dispatch o con l’helper event().
Ci sono metodi condizionali.

Emissione dopo il commit della transazione

Se vuoi emettere l’evento solo dopo il commit di una transazione, implementa l’interfaccia ShouldDispatchAfterCommit sull’evento. Se la transazione fallisce l’evento viene scartato.

Implementazione dei listener

Il listener riceve l’evento nel metodo handle. Nel costruttore, il service container inietta automaticamente le dipendenze.
Restituendo 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’interfaccia ShouldQueue 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.
Puoi anche determinare i valori dinamicamente con metodi.

Numero massimo di tentativi e timeout

Con #[Tries] e #[Timeout] controlli il comportamento in caso di fallimento.

Gestione dei fallimenti

Definendo il metodo failed 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 metodo subscribe restituisci un array che mappa eventi a handler.

Registrazione del subscriber

Con l’event discovery attivo, i subscriber che restituiscono un array da subscribe 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

Modifica app/Events/UserRegistered.php per mantenere l’utente registrato.
2

Crea la classe listener

Per gestire l’invio email in coda implementa 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.
Con l’event discovery attivo non serve registrazione manuale in AppServiceProvider. I listener in app/Listeners vengono rilevati automaticamente.
Con php artisan event:list verifichi l’elenco di eventi e listener registrati. Controllalo periodicamente per assicurarti che non siano registrati listener inaspettati.
Ultima modifica il 13 luglio 2026