Laravel
Laravel 11 & 10 • Chapitre 4 : Fonctionnalités Avancées

Événements & Listeners : L'Architecture Découplée

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.

📢
Events Découplés

Un événement transporte uniquement les données (ex: OrderPlaced) sans se soucier de qui l'écoute.

👂
Multiples Listeners

Un seul événement peut déclencher 3 actions distinctes : envoi d'email, notification SMS et alerte stock.

⚡
ShouldQueue

Implémentez l'interface ShouldQueue pour déléguer les tâches lentes aux files d'attente asynchrones.

🤖
Découverte Auto (L11)

Laravel 11 découvre et relie automatiquement vos événements et listeners sans aucune déclaration manuelle.

OrderPlaced.php & SendOrderConfirmation.php
// 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);

Simulateur Simulateur de Bus d'Événements & Multi-Listeners

Simulation Architecture Événementielle

Simulez le passage d'une commande client pour observer comment l'événement unique OrderPlaced::dispatch() notifie instantanément 3 listeners indépendants.

ÉVÉNEMENT CLIENT
Commande #1042 passée par "claire@learnweb.test" (189.50 €)
📧 En attente
SendOrderConfirmation

Envoie l'email de confirmation au client avec le récapitulatif PDF.

📦 En attente
NotifyWarehouse

Notifie le centre logistique pour préparer le colis et réserver le stock.

📈 En attente
UpdateSalesMetrics

Incrémente le chiffre d'affaires dans le tableau de bord de gestion.

Règle d'Or : Toujours utiliser ShouldQueue

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.

SerializesModels Trait

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.