Event Bus und Observer-Pattern in PHP: Von der Theorie zur Praxis
\n\nIn der modernen PHP-Entwicklung wird es immer häufiger erforderlich, lose gekoppelte, flexible und erweiterbare Systeme zu erstellen. Zwei Schlüsselwerkzeuge, um dieses Ziel zu erreichen, sind das Observer-Pattern und seine fortgeschrittenere Abstraktion – der Event Bus (Ereignisbus). In diesem Artikel analysieren wir, wie man beide Ansätze in PHP implementiert, und zeigen, wann welches Werkzeug zu wählen ist.
\n\nWas ist das Observer-Pattern?
\n\nDas Observer-Pattern (Beobachter) ist ein Verhaltensmuster der Softwareentwicklung, das eine „Eins-zu-Viele“-Abhängigkeit zwischen Objekten definiert. Wenn ein Objekt (der Herausgeber) seinen Zustand ändert, werden alle abhängigen Objekte (die Abonnenten) automatisch darüber benachrichtigt.
\n\nEine einfache Implementierung des Observer in 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 // Logik der Registrierung\n echo "Benutzer $name wurde registriert.\\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 "Sende Begrüßungs-E-Mail an {$data['name']}.\\n";\n }\n }\n}\n\nclass Logger implements Observer {\n public function update(string $event, $data): void {\n echo "Protokolliere Ereignis: $event\\n";\n }\n}\n\n// Verwendung\n$userManager = new UserManager();\n$userManager->attach(new EmailNotifier());\n$userManager->attach(new Logger());\n\n$userManager->registerUser('Ivan');\n?>\n\nNachteile des klassischen Observer
\n\n- \n
- Feste Kopplung – Abonnenten müssen den Herausgeber kennen. \n
- Mangelnde Flexibilität – Es ist schwierig, viele unterschiedliche Ereignisse zu verwalten. \n
- Probleme beim Testen – Jeder Herausgeber enthält eine Liste von Beobachtern. \n
Event Bus – Evolution des Observer-Patterns
\n\nEvent Bus (Ereignisbus) ist ein zentraler Vermittler zwischen Ereignis-Herausgebern und ihren Abonnenten. Anstatt dass jedes Herausgeber-Objekt die Liste der Beobachter verwaltet, laufen alle Abonnements und Benachrichtigungen über einen einzigen Bus.
\n\nImplementierung eines Event Bus in 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 Auch in der Bibliothek
PDF-Generierung in PHP: Überblick über Bibliotheken und Codebeispiele
Redis (ioredis) für JavaScript (Node.js): Komplettguide mit Beispielen
Flysystem PHP: Komplettes Handbuch mit Praxisbeispielen
Viper für Go: Vollständiger Leitfaden mit Beispielen