acc-cqrs-knowledge
CQRS Knowledge Base
Quick reference for CQRS architecture patterns and PHP implementation guidelines.
Core Principles
Separation of Concerns
┌─────────────────────────────────────────────────────────────┐
│ APPLICATION │
├─────────────────────────────────────────────────────────────┤
│ WRITE SIDE (Commands) │ READ SIDE (Queries) │
├─────────────────────────────┼───────────────────────────────┤
│ Command → Handler → Domain │ Query → Handler → ReadModel │
│ Changes state │ Returns data, no side effects│
│ Uses Domain Model │ Can bypass Domain Model │
│ Single aggregate per cmd │ Can join multiple sources │
└─────────────────────────────┴───────────────────────────────┘
Rule: Commands WRITE, Queries READ. Never mix.
CQRS Components
| Component | Purpose | Returns | Side Effects |
|---|---|---|---|
| Command | Request to change state | void or ID | Yes |
| CommandHandler | Executes command logic | void or ID | Yes |
| Query | Request for data | Data DTO | No |
| QueryHandler | Fetches and transforms data | Data DTO | No |
| CommandBus | Routes commands to handlers | Depends | N/A |
| QueryBus | Routes queries to handlers | Query result | N/A |
Quick Checklists
Command Checklist
- Named as imperative verb + noun (CreateOrder, ConfirmPayment)
- Immutable (readonly class)
- Contains only data needed for operation
- Returns void or created ID (never entities)
- One command = one aggregate affected
- Validated before dispatch
Query Checklist
- Named as Get/Find/List + noun (GetOrderDetails, ListCustomers)
- Immutable (readonly class)
- Contains filtering/pagination params
- Handler has NO side effects
- Can use optimized read models
- Returns DTOs, not entities
Handler Checklist
- Single
execute()or__invoke()method - One handler per command/query
- CommandHandler can dispatch domain events
- QueryHandler never dispatches events
- No cross-aggregate transactions in single handler
Common Violations Quick Reference
| Violation | Where to Look | Severity |
|---|---|---|
| Query with side effects | QueryHandler calling save() | Critical |
| Command returning data | CommandHandler returning entity | Critical |
| Mixed read/write in handler | Handler with both get and save | Critical |
| Business logic in handler | if/switch on domain state | Warning |
| Missing command validation | Command without invariants | Warning |
| Query using write DB | QueryHandler using EntityManager | Info |
PHP 8.5 CQRS Patterns
Command
final readonly class CreateOrderCommand
{
public function __construct(
public CustomerId $customerId,
/** @var array<OrderLineData> */
public array $lines,
public ?string $notes = null
) {
if (empty($lines)) {
throw new InvalidArgumentException('Order must have at least one line');
}
}
}
Command Handler
final readonly class CreateOrderHandler
{
public function __construct(
private OrderRepositoryInterface $orders,
private EventDispatcherInterface $events
) {}
public function __invoke(CreateOrderCommand $command): OrderId
{
$order = Order::create(
id: OrderId::generate(),
customerId: $command->customerId,
lines: $command->lines
);
$this->orders->save($order);
foreach ($order->releaseEvents() as $event) {
$this->events->dispatch($event);
}
return $order->id();
}
}
Query
final readonly class GetOrderDetailsQuery
{
public function __construct(
public OrderId $orderId
) {}
}
Query Handler
final readonly class GetOrderDetailsHandler
{
public function __construct(
private OrderReadModelInterface $readModel
) {}
public function __invoke(GetOrderDetailsQuery $query): ?OrderDetailsDTO
{
return $this->readModel->findById($query->orderId);
}
}
References
For detailed information, load these reference files:
references/command-patterns.md— Command structure, naming, validationreferences/query-patterns.md— Query structure, read modelsreferences/handler-patterns.md— Handler patterns, async/syncreferences/bus-patterns.md— Command/Query bus implementationsreferences/antipatterns.md— Common violations with detection patterns
More from dykyi-roman/awesome-claude-code
psr-overview-knowledge
PHP Standards Recommendations (PSR) overview knowledge base. Provides comprehensive reference for all accepted PSRs including PSR-1,3,4,6,7,11,12,13,14,15,16,17,18,20. Use for PSR selection decisions and compliance audits.
22detect-code-smells
Detects code smells in PHP codebases. Identifies God Class, Feature Envy, Data Clumps, Long Parameter List, Long Method, Primitive Obsession, Message Chains, Inappropriate Intimacy. Generates actionable reports with refactoring recommendations.
15clean-arch-knowledge
Clean Architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Clean Architecture and Hexagonal Architecture audits.
15ddd-knowledge
DDD architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Domain-Driven Design audits.
14testing-knowledge
Testing knowledge base for PHP 8.4 projects. Provides testing pyramid, AAA pattern, naming conventions, isolation principles, DDD testing guidelines, and PHPUnit patterns.
12bug-root-cause-finder
Root cause analysis methods for PHP bugs. Provides 5 Whys technique, fault tree analysis, git bisect guidance, and stack trace parsing.
12