Le pattern Observer / Publish-Subscribe de Laravel permet à votre application de réagir à des actions importantes (inscription d'un membre, paiement d'une commande) sans alourdir vos contrôleurs avec des dizaines d'actions annexes.
Un événement transporte uniquement les données (ex: OrderPlaced) sans se soucier de qui l'écoute.
Un seul événement peut déclencher 3 actions distinctes : envoi d'email, notification SMS et alerte stock.
Implémentez l'interface ShouldQueue pour déléguer les tâches lentes aux files d'attente asynchrones.
Laravel 11 découvre et relie automatiquement vos événements et listeners sans aucune déclaration manuelle.
// 1. Générer l'événement et le listener en terminal :
// php artisan make:event OrderPlaced
// php artisan make:listener SendOrderConfirmation --event=OrderPlaced
// 2. app/Events/OrderPlaced.php (Événement typé en PHP 8.2)
namespace AppEvents;
use AppModelsOrder;
use IlluminateFoundationEventsDispatchable;
use IlluminateQueueSerializesModels;
class OrderPlaced
{
use Dispatchable, SerializesModels;
// Promotion de propriété en constructeur PHP 8
public function __construct(public Order $order) {}
}
// 3. app/Listeners/SendOrderConfirmation.php (Listener Asynchrone)
namespace AppListeners;
use AppEventsOrderPlaced;
use IlluminateContractsQueueShouldQueue;
use IlluminateSupportFacadesMail;
class SendOrderConfirmation implements ShouldQueue
{
public function handle(OrderPlaced $event): void
{
// Accès direct à l'objet commande injecté dans l'événement
Mail::to($event->order->customer_email)->send(new OrderReceiptMail($event->order));
}
}
// 4. Dans le contrôleur : Déclenchement élégant en une seule ligne !
OrderPlaced::dispatch($order); Simulez le passage d'une commande client pour observer comment l'événement unique OrderPlaced::dispatch() notifie instantanément 3 listeners indépendants.
Envoie l'email de confirmation au client avec le récapitulatif PDF.
Notifie le centre logistique pour préparer le colis et réserver le stock.
Incrémente le chiffre d'affaires dans le tableau de bord de gestion.
L'envoi d'email ou la génération de documents peut prendre 1 à 3 secondes. En ajoutant implements ShouldQueue sur votre Listener, le contrôleur répond immédiatement en moins de 50 millisecondes à l'utilisateur pendant que le travail lourd s'effectue en arrière-plan.
Le trait SerializesModels sérialise uniquement l'identifiant ID de votre modèle Eloquent dans la file d'attente, évitant de stocker un objet lourd et rechargeant l'état le plus frais de la BDD lors de l'exécution du listener.