CQRS e Event Sourcing em PHP: Arquitetura para Projetos Complexos

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

Por que o CRUD comum para de funcionar quando o projeto cresce

\n\n

Imagine: você está desenvolvendo uma loja virtual em PHP. No começo, tudo é simples — adicionou um produto, alterou o preço, excluiu. Mas depois de seis meses, surgem novos requisitos: auditoria de todas as alterações, restauração de dados em uma data específica, lógica complexa de descontos. O CRUD comum (Create, Read, Update, Delete) começa a ruir. O banco de dados vira uma bagunça, e cada nova solicitação do cliente exige reescrever metade do sistema.

\n\n

Familiar? Então você certamente precisará de CQRS (Command Query Responsibility Segregation) e Event Sourcing — dois padrões poderosos que mudam a abordagem de desenvolvimento. Neste artigo, vamos analisá-los com exemplos reais em PHP, para que você possa aplicá-los em seus projetos.

\n\n

O que são CQRS e Event Sourcing em palavras simples

\n\n

CQRS: separação de comandos e consultas

\n\n

CQRS é um padrão arquitetural que divide as operações em dois tipos: comandos (alteram o estado) e consultas (leem o estado). No MVC clássico, tanto o controller quanto o modelo trabalham com as mesmas entidades. O CQRS propõe separar essas responsabilidades.

\n\n

Imagine uma biblioteca: há uma mesa separada para registrar livros (comandos) e uma mesa separada para leitura (consultas). Ninguém atrapalha o outro, e cada um é otimizado para sua tarefa.

\n\n

Event Sourcing: histórico de alterações em vez do estado atual

\n\n

Event Sourcing é uma forma de armazenar dados onde você não salva o estado atual de um objeto, mas sim a sequência de todos os eventos que levaram a ele. Em vez de uma única linha "Pedido nº123: status = entregue", você armazena: "Pedido criado → Pago → Enviado → Entregue".

\n\n

É como uma gravação de vídeo em vez de uma foto: você sempre pode voltar e ver o que aconteceu em qualquer momento.

\n\n

Quando aplicar CQRS e Event Sourcing em PHP

\n\n

Esses padrões não são uma bala de prata. Para um blog simples, eles são excessivos. Mas aqui estão cenários onde são indispensáveis:

\n\n
    \n
  • Lógica de domínio complexa (finanças, reservas, logística)
  • \n
  • Requisitos de auditoria — precisa saber quem e quando alterou os dados
  • \n
  • Restauração de estado em qualquer data
  • \n
  • Arquitetura de microsserviços — eventos são facilmente transmitidos entre serviços
  • \n
  • Alta carga de leitura — é possível criar um modelo de leitura separado, otimizado para consultas
  • \n
\n\n

Se o seu projeto é uma loja virtual com milhares de pedidos, um sistema CRM ou uma aplicação bancária — CQRS e Event Sourcing certamente serão úteis.

\n\n

Implementação prática de CQRS em PHP

\n\n

Vamos ao código. Implementaremos um sistema simples de gerenciamento de pedidos. Começaremos com CQRS.

\n\n

Passo 1: Definindo comandos e consultas

\n\n

Um comando é um DTO (Data Transfer Object) que contém todos os dados para executar uma operação. O comando nunca retorna dados — apenas altera o estado.

\n\n
<?php\n// src/Application/Command/CreateOrderCommand.php\nnamespace App\\Application\\Command;\n\nclass CreateOrderCommand\n{\n    public function __construct(\n        public readonly string $orderId,\n        public readonly string $customerId,\n        public readonly array $items, // [['productId' => '...', 'quantity' => 2], ...]\n        public readonly \\DateTimeImmutable $createdAt\n    ) {}\n}\n
\n\n

Uma consulta também é um DTO, mas para leitura. Pode conter filtros e retornar dados.

\n\n
<?php\n// src/Application/Query/GetOrderQuery.php\nnamespace App\\Application\\Query;\n\nclass GetOrderQuery\n{\n    public function __construct(\n        public readonly string $orderId\n    ) {}\n}\n
\n\n

Passo 2: Criando manipuladores de comandos

\n\n

O manipulador de comando é um serviço que executa a lógica de negócio. Ele recebe um comando e altera o estado

Blogs

Book Recommendations