Event Bus e padrão Observer em PHP: da teoria à prática
No desenvolvimento moderno em PHP, cada vez mais é necessário criar sistemas fracamente acoplados, flexíveis e extensíveis. Duas ferramentas-chave para atingir esse objetivo são o padrão Observer e sua abstração mais avançada — o Event Bus (Barramento de Eventos). Neste artigo, vamos analisar como implementar ambas as abordagens em PHP e mostrar quando escolher cada ferramenta.
O que é o padrão Observer?
O padrão Observer (Observador) é um padrão de projeto comportamental que define uma dependência do tipo "um para muitos" entre objetos. Quando um objeto (publicador) muda seu estado, todos os objetos dependentes (assinantes) são automaticamente notificados sobre isso.
Implementação simples do Observer em 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 "Usuário $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 email de boas-vindas 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('João');?>Desvantagens do Observer clássico
- Acoplamento rígido — os assinantes precisam conhecer o publicador.
- Falta de flexibilidade — difícil gerenciar múltiplos eventos heterogêneos.
- Problemas com teste — cada publicador contém uma lista de observadores.
Event Bus — evolução do padrão Observer
Event Bus (Barramento de Eventos) é um mediador centralizado entre publicadores de eventos e seus assinantes. Em vez de cada objeto publicador gerenciar uma lista de observadores, todas as assinaturas e notificações passam por um barramento único.
Implementação do Event Bus em 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 Também na biblioteca
Geração Swagger/OpenAPI para TypeScript: bibliotecas e ferramentas
Crossbeam para Rust: guia completo com exemplos práticos
Geolocalização e Mapas em JavaScript (Node.js): bibliotecas e ferramentas
Mikro-ORM para TypeScript: guia completo com exemplos práticos
Wire para Go: guia completo com exemplos