Event Bus und Observer-Pattern in PHP: Implementierung und Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Event Bus und Observer-Pattern in PHP: Von der Theorie zur Praxis

\n\n

In 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\n

Was ist das Observer-Pattern?

\n\n

Das 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\n

Eine 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\n

Nachteile 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
\n\n

Event Bus – Evolution des Observer-Patterns

\n\n

Event 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\n

Implementierung 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                    

Empfehlungen