Guide complet Symfony/EventDispatcher PHP : tutoriel et exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction au système d'événements Symfony/EventDispatcher

Le système d'événements (Event Dispatcher) est l'un des composants clés de l'écosystème Symfony, implémentant les patrons de conception "Observateur" (Observer) et "Médiateur" (Mediator). La bibliothèque symfony/event-dispatcher offre un mécanisme léger mais puissant pour créer une architecture d'application faiblement couplée. Au lieu de lier rigidement les composants par des appels de méthodes directs, vous pouvez "déclencher" des événements, et toute partie intéressée de l'application (écouteurs/abonnés) peut y réagir. Cela simplifie considérablement l'extension des fonctionnalités, les tests et la maintenance du code.

Pourquoi en avez-vous besoin ? Imaginez que vous deviez ajouter la journalisation de chaque action utilisateur, l'envoi d'un email de notification après une inscription et la mise à jour du cache après une modification de données. Sans système d'événements, vous seriez obligé d'insérer des appels aux services correspondants directement dans les méthodes du contrôleur ou du modèle. Cela crée un couplage fort et rend le code "fragile". Avec EventDispatcher, vous déclenchez simplement l'événement UserRegistered, et des écouteurs distincts (journaliseur, service email, gestionnaire de cache) s'y abonnent et effectuent leur travail. L'ajout de nouvelles fonctionnalités se résume à l'écriture d'un nouvel écouteur, sans modifier le code existant.

Cette bibliothèque est utilisée non seulement dans le framework Symfony complet, mais aussi dans les micro-frameworks (Silex, Laravel — qui a sa propre implémentation mais le concept reste le même), ainsi que dans tout projet PHP nécessitant un système flexible de hooks et de plugins. Elle est devenue la norme de facto pour la programmation orientée événements en PHP.

Installation

L'installation se fait via Composer, le gestionnaire de paquets standard pour PHP. Ouvrez un terminal à la racine de votre projet et exécutez la commande :

composer require symfony/event-dispatcher

Si vous prévoyez d'utiliser un conteneur d'injection de dépendances (Dependency Injection) et l'enregistrement automatique des écouteurs, il est également recommandé d'installer le paquet pour DependencyInjection (généralement fourni avec Symfony Framework). Pour une utilisation autonome, symfony/event-dispatcher seul suffit.

Démarrage rapide : exemple minimal fonctionnel

Créons un système très simple : nous allons déclencher un événement "order.placed" (commande passée) et l'écouter.

<?php
// 1. Inclure l'autoloader de Composer
require_once 'vendor/autoload.php';

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\GenericEvent;

// 2. Créer le dispatcher
$dispatcher = new EventDispatcher();

// 3. Ajouter un écouteur (closure) sur l'événement 'order.placed'
$dispatcher->addListener('order.placed', function (GenericEvent $event) {
    $orderData = $event->getSubject();
    echo "Écouteur 1 : Commande {$orderData['id']} passée. Montant : {$orderData['total']}\n";
});

// 4. Créer l'événement et y passer les données
$event = new GenericEvent(['id' => 123, 'total' => 2500.00]);

// 5. Dispatcher (déclencher) l'événement
$dispatcher->dispatch($event, 'order.placed');

// Affichage : Écouteur 1 : Commande 123 passée. Montant : 2500

Cet exemple illustre le mécanisme de base : création du dispatcher, enregistrement d'un écouteur et envoi de l'événement. Notez que l'écouteur reçoit un objet événement dont on peut extraire toutes les données.

Méthodes et classes principales

Examinons les 8 éléments clés de la bibliothèque qui couvrent 90% des cas d'utilisation.

1. EventDispatcher::addListener()

Signature : addListener(string $eventName, callable $listener, int $priority = 0): void

Fonction : Enregistre un écouteur (callable) pour un nom d'événement donné. Vous pouvez spécifier une priorité : plus le nombre est élevé, plus l'écouteur sera exécuté tôt.

Recommendations