Sébastien TIMONER
Experte für Webentwicklung und technisches Teammanagement, ich spezialisiere mich auf die Erstellung und Optimierung leistungsstarker digitaler Lösungen. Mit fundierter Expertise in modernen Technologien wie React.js, Node.js, TypeScript, Symfony, Docker und FrankenPHP stelle ich den Erfolg komplexer SaaS-Projekte von der Konzeption bis zur Produktion für Unternehmen verschiedener Branchen sicher.
Du hörst überall von CQRS, fragst dich aber, wie du es anwenden kannst, ohne sofort Symfony oder Laravel auszupacken? Gute Nachricht: Wir können Command Query Responsibility Segregation in purem PHP erkunden – mit einer klaren Organisation und ein paar gut durchdachten Klassen. Schnapp dir deinen Editor, wir legen gemeinsam die Basis.
php -v
, um readonly
-Properties, strikte Typen und native First-Class Callables zu nutzen.php -S 127.0.0.1:8000 -t public
reicht zum Experimentieren).Wenn du bei einer älteren Version bleiben musst, stelle sicher, dass die verwendeten Features (Konstruktor-Promotion, readonly
-Properties usw.) verfügbar sind oder passe die Snippets an.
CQRS bedeutet, Lesen (Query) und Schreiben (Command) strikt zu trennen. Daraus entstehen zwei optimierte Pfade:
Diese Trennung entspringt zwar der DDD-Philosophie, aber du kannst sie auch ohne viel Formalismus übernehmen. Sofortige Vorteile:
Denke daran, dass CQRS etwas strukturelle Komplexität mitbringt. Für ein simples CRUD kann das zu viel sein. Nutze es, wenn Geschäftslogik oder Skalierungsanforderungen den Aufwand rechtfertigen.
Wir bleiben schlank mit einem einfachen Verzeichnisbaum:
src/
Domain/
Article.php
ArticleRepository.php
Application/
Command/
CreateArticle/
CreateArticleCommand.php
CreateArticleHandler.php
Query/
ListArticles/
ListArticlesQuery.php
ListArticlesHandler.php
Bus/
CommandBus.php
QueryBus.php
Infrastructure/
InMemoryArticleRepository.php
public/
index.php
So trennen wir Domain (Geschäftsregeln), Application (Use Cases) und Infrastructure (konkrete Implementierungen).
Wir erstellen ein Article
-Aggregat und sein Repository:
php
php
Der Command transportiert die Absicht. Der Handler orchestriert die Geschäftslogik.
php
php
Wichtiger Hinweis: Der Handler gibt nichts zurück. Wenn du den Artikel erneut lesen möchtest, gehst du über eine Query.
php
php
Wir liefern hier ein Array, das direkt serialisiert werden kann, ohne die Präsentationsschicht an das Domänenmodell zu koppeln.
Später kannst du diese Implementierung durch Doctrine, PDO oder eine externe API ersetzen – ohne die Handler anzufassen.
Der CQRS-Ansatz glänzt, sobald du die Handler-Auflösung zentralisierst:
Diese Busse sind bewusst simpel, reichen aber, um das Prinzip zu verstehen. In echten Projekten kannst du sie an einen Dependency-Injection-Container (PHP-DI, Symfony DI usw.) anbinden.
Der Operator (First-Class Callable), seit PHP 8.1 verfügbar, wird in PHP 8.4 vollständig unterstützt. Musst du eine ältere Version (8.0 oder niedriger) bedienen, ersetze ihn durch .
Steht dieses Fundament, kannst du deine Lösung ausbauen:
Mit diesem Gerüst kannst du CQRS schrittweise in ein bestehendes Projekt einführen oder einen neuen Service ohne Framework starten. Entscheidend ist, die Grenze zwischen Lesen und Schreiben klar zu halten und die Architektur iterativ weiterzuentwickeln. Viel Erfolg beim Experimentieren!
php
php
php
public/index.php
php
(...)
fn ($command) => $createHandler($command)
ArticlePublished