Symfony/EventDispatcher para PHP: guia completo com 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

Introdução ao sistema de eventos Symfony/EventDispatcher

O sistema de eventos (Event Dispatcher) é um dos componentes essenciais do ecossistema Symfony, que implementa os padrões de projeto "Observer" (Observador) e "Mediator" (Mediador). A biblioteca symfony/event-dispatcher oferece um mecanismo leve, porém poderoso, para criar uma arquitetura de aplicação com baixo acoplamento. Em vez de ligar rigidamente os componentes com chamadas diretas de métodos, você pode "disparar" eventos, e qualquer parte interessada da aplicação (ouvintes/assinantes) pode reagir a eles. Isso simplifica drasticamente a extensão de funcionalidades, os testes e a manutenção do código.

Por que isso é necessário? Imagine que você precise adicionar o registro (log) de cada ação do usuário, enviar um e-mail de notificação após o cadastro e atualizar o cache após alterar dados. Sem um sistema de eventos, você teria que inserir chamadas aos serviços correspondentes diretamente nos métodos do controller ou do model. Isso cria um forte acoplamento (coupling) e torna o código "frágil". Com o EventDispatcher, você simplesmente dispara o evento UserRegistered, e ouvintes separados (logger, serviço de e-mail, gerenciador de cache) se inscrevem nele e executam seu trabalho. Adicionar uma nova funcionalidade se resume a escrever um novo ouvinte, sem modificar o código existente.

A biblioteca não é usada apenas no framework Symfony completo, mas também em microframeworks (Silex, Laravel — que tem sua própria implementação, mas o conceito é o mesmo), e em qualquer projeto PHP que necessite de um sistema flexível de hooks e plugins. Ela é o padrão de facto para programação orientada a eventos em PHP.

Instalação

A instalação é feita via Composer, o gerenciador de pacotes padrão para PHP. Abra o terminal na raiz do seu projeto e execute o comando:

composer require symfony/event-dispatcher

Se você planeja usar um contêiner de injeção de dependência (Dependency Injection) e o registro automático de ouvintes, é recomendável instalar também o pacote para trabalhar com DependencyInjection (geralmente incluso no Symfony Framework). Para uso autônomo, apenas o symfony/event-dispatcher é suficiente.

Início rápido: exemplo funcional mínimo

Vamos criar um sistema simples: dispararemos o evento "order.placed" (pedido realizado) e o ouviremos.

<?php
// 1. Incluímos o autoloader do Composer
require_once 'vendor/autoload.php';

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\GenericEvent;

// 2. Criamos o dispatcher
$dispatcher = new EventDispatcher();

// 3. Adicionamos um ouvinte (closure) para o evento 'order.placed'
$dispatcher->addListener('order.placed', function (GenericEvent $event) {
    $orderData = $event->getSubject();
    echo "Ouvinte 1: Pedido {$orderData['id']} realizado. Valor: {$orderData['total']}\n";
});

// 4. Criamos o evento e passamos os dados
$event = new GenericEvent(['id' => 123, 'total' => 2500.00]);

// 5. Disparamos (geramos) o evento
$dispatcher->dispatch($event, 'order.placed');

// Saída: Ouvinte 1: Pedido 123 realizado. Valor: 2500

Este exemplo demonstra a mecânica básica: criar o dispatcher, registrar um ouvinte e enviar um evento. Observe que o ouvinte recebe o objeto do evento, do qual é possível extrair quaisquer dados.

Métodos e classes principais

Vamos analisar os 8 elementos-chave da biblioteca que cobrem 90% dos cenários de uso.

1. EventDispatcher::addListener()

Assinatura: addListener(string $eventName, callable $listener, int $priority = 0): void

O que faz: Registra um ouvinte (callable) para o nome do evento especificado. É possível definir uma prioridade: quanto maior o número, mais cedo o ouvinte será executado.

Recommendations