Por que o CRUD comum para de funcionar quando o projeto cresce
\n\nImagine: 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\nFamiliar? 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\nO que são CQRS e Event Sourcing em palavras simples
\n\nCQRS: separação de comandos e consultas
\n\nCQRS é 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\nImagine 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\nEvent Sourcing: histórico de alterações em vez do estado atual
\n\nEvent 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\nQuando aplicar CQRS e Event Sourcing em PHP
\n\nEsses 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
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\nImplementação prática de CQRS em PHP
\n\nVamos ao código. Implementaremos um sistema simples de gerenciamento de pedidos. Começaremos com CQRS.
\n\nPasso 1: Definindo comandos e consultas
\n\nUm 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\nUma 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\nPasso 2: Criando manipuladores de comandos
\n\nO manipulador de comando é um serviço que executa a lógica de negócio. Ele recebe um comando e altera o estado