Event Bus e padrão Observer em PHP: implementação e exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations