Event Bus y el patrón Observer en PHP: implementación y ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Event Bus y el patrón Observer en PHP: de la teoría a la práctica



En el desarrollo moderno con PHP, cada vez es más necesario crear sistemas débilmente acoplados, flexibles y extensibles. Dos herramientas clave para lograr este objetivo son el patrón Observer y su abstracción más avanzada: el Event Bus (Bus de eventos). En este artículo, analizaremos cómo implementar ambos enfoques en PHP y mostraremos cuándo elegir cada herramienta.



¿Qué es el patrón Observer?



El patrón Observer (Observador) es un patrón de diseño de comportamiento que define una dependencia de tipo «uno a muchos» entre objetos. Cuando un objeto (editor) cambia su estado, todos los objetos dependientes (suscriptores) son notificados automáticamente.



Implementación simple de Observer en PHP:



<?phpinterface Observer {    public function update(string $event, $data): void;}

interface Observable { public function attach(Observer $observer): void; public function detach(Observer $observer): void; public function notify(string $event, $data = null): void;}

class UserManager implements Observable { private array $observers = [];

public function attach(Observer $observer): void { $this->observers[] = $observer; }

public function detach(Observer $observer): void { $this->observers = array_filter( $this->observers, fn($obs) => $obs !== $observer ); }

public function notify(string $event, $data = null): void { foreach ($this->observers as $observer) { $observer->update($event, $data); } }

public function registerUser(string $name): void { // Lógica de registro echo "Usuario $name registrado."; $this->notify('user.registered', ['name' => $name]); }}

class EmailNotifier implements Observer { public function update(string $event, $data): void { if ($event === 'user.registered') { echo "Enviando correo de bienvenida para {$data['name']}."; } }}

class Logger implements Observer { public function update(string $event, $data): void { echo "Registrando evento: $event"; }}

// Uso$userManager = new UserManager();$userManager->attach(new EmailNotifier());$userManager->attach(new Logger());

$userManager->registerUser('Iván');?>


Desventajas del Observer clásico



  • Acoplamiento rígido — los suscriptores deben conocer al editor.
  • Falta de flexibilidad — es difícil gestionar múltiples eventos heterogéneos.
  • Problemas de prueba — cada editor contiene una lista de observadores.


Event Bus — evolución del patrón Observer



Event Bus (Bus de eventos) es un mediador centralizado entre los editores de eventos y sus suscriptores. En lugar de que cada objeto editor gestione su propia lista de observadores, todas las suscripciones y notificaciones pasan a través de un bus único.



Implementación de Event Bus en PHP



<?phpclass EventBus {    private array $listeners = [];

public function subscribe(string $event, callable $handler): void { $this->listeners[$event][] = $handler; }

public function unsubscribe(string $event, callable $handler): void { if (!isset($this->listeners[$event])) { return; } $this->listeners[$event] = array_filter( $this->listeners[$event], fn($h) => $h !== $handler ); }

public function dispatch(string $event, $payload = null): void { if (!isset($this->listeners[$event])) { return; } foreach ($this->listeners[$event] as $handler) { call_user_func

Recommendations