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 También en la biblioteca
Trabajo con XML en Rust: bibliotecas roxmltree, quick-xml y serde-xml-rs
Generación de PDF en C# (.NET): Resumen de bibliotecas y herramientas
Bytes para Rust: guía completa con ejemplos prácticos
Trabajo con imágenes en Swift: resize y crop para iOS/macOS