Event Bus et le pattern Observer en PHP : implémentation 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

Event Bus et le pattern Observer en PHP : de la théorie à la pratique

\n\n

Dans le développement moderne en PHP, il est de plus en plus nécessaire de créer des systèmes faiblement couplés, flexibles et extensibles. Deux outils clés pour atteindre cet objectif sont le pattern Observer et son abstraction plus avancée — l'Event Bus (Bus d'événements). Dans cet article, nous analyserons comment implémenter les deux approches en PHP et montrerons quand choisir quel outil.

\n\n

Qu'est-ce que le pattern Observer ?

\n\n

Le pattern Observer (Observateur) est un modèle de conception comportemental qui définit une relation de type « un à plusieurs » entre les objets. Lorsqu'un objet (l'éditeur) change d'état, tous les objets dépendants (les abonnés) en sont automatiquement notifiés.

\n\n

Implémentation simple de l'Observer en PHP :

\n\n
<?php\ninterface Observer {\n    public function update(string $event, $data): void;\n}\n\ninterface Observable {\n    public function attach(Observer $observer): void;\n    public function detach(Observer $observer): void;\n    public function notify(string $event, $data = null): void;\n}\n\nclass UserManager implements Observable {\n    private array $observers = [];\n\n    public function attach(Observer $observer): void {\n        $this->observers[] = $observer;\n    }\n\n    public function detach(Observer $observer): void {\n        $this->observers = array_filter(\n            $this->observers,\n            fn($obs) => $obs !== $observer\n        );\n    }\n\n    public function notify(string $event, $data = null): void {\n        foreach ($this->observers as $observer) {\n            $observer->update($event, $data);\n        }\n    }\n\n    public function registerUser(string $name): void {\n        // Logique d'inscription\n        echo "Utilisateur $name inscrit.\\n";\n        $this->notify('user.registered', ['name' => $name]);\n    }\n}\n\nclass EmailNotifier implements Observer {\n    public function update(string $event, $data): void {\n        if ($event === 'user.registered') {\n            echo "Envoi d'un email de bienvenue à {$data['name']}.\\n";\n        }\n    }\n}\n\nclass Logger implements Observer {\n    public function update(string $event, $data): void {\n        echo "Journalisation de l'événement : $event\\n";\n    }\n}\n\n// Utilisation\n$userManager = new UserManager();\n$userManager->attach(new EmailNotifier());\n$userManager->attach(new Logger());\n\n$userManager->registerUser('Ivan');\n?>
\n\n

Inconvénients de l'Observer classique

\n\n
    \n
  • Couplage fort — les abonnés doivent connaître l'éditeur.
  • \n
  • Manque de flexibilité — difficile de gérer plusieurs événements hétérogènes.
  • \n
  • Problèmes de test — chaque éditeur contient une liste d'observateurs.
  • \n
\n\n

Event Bus — l'évolution du pattern Observer

\n\n

L'Event Bus (Bus d'événements) est un intermédiaire centralisé entre les éditeurs d'événements et leurs abonnés. Au lieu que chaque objet éditeur gère sa propre liste d'observateurs, tous les abonnements et notifications passent par un bus unique.

\n\n

Implémentation d'un Event Bus en PHP

\n\n
<?php\nclass EventBus {\n    private array $listeners = [];\n\n    public function subscribe(string $event, callable $handler): void {\n        $this->listeners[$event][] = $handler;\n    }\n\n    public function unsubscribe(string $event, callable $handler): void {\n        if (!isset($this->listeners[$event])) {\n            return;\n        }\n        $this->listeners[$event] = array_filter(\n            $this->listeners[$event],\n            fn($h) => $h !== $handler\n        );\n    }\n\n    public function dispatch(string $event, $payload = null): void {\n        if (!isset($this->listeners[$event])) {\n            return;\n        }\n        foreach ($this->listeners[$event] as $handler) {\n            call_user_func                    

Recommendations