Heim >Backend-Entwicklung >PHP8 >Wie benutze ich CQRs (Befehlsabfrageverantwortung Segregation) in Php 8?
1. Definieren Sie Befehle und Abfragen:
Befehle repräsentieren Aktionen, die den Anwendungszustand ändern. Sie sollten einfache, atomare Operationen sein. Abfragen hingegen sind schreibgeschützte Operationen, die Daten abrufen. In PHP können Sie diese mit Klassen darstellen:
<code class="php">// Command class CreateUserCommand { public function __construct(public string $name, public string $email) {} } // Query class GetUserQuery { public function __construct(public int $userId) {} }</code>2. Befehlshandler und Abfragebehandler erstellen:
Diese sind für die Verarbeitung von Befehlen bzw. Abfragen verantwortlich. Befehlshandler interagieren typischerweise mit einer Persistenzschicht (z. B. einer Datenbank), um Daten zu aktualisieren. Abfragebehandler rufen Daten aus der Persistenzschicht oder anderen Quellen ab.
<code class="php">// Command Handler class CreateUserCommandHandler { public function __construct(private PDO $pdo) {} public function handle(CreateUserCommand $command): void { $stmt = $this->pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $stmt->execute([$command->name, $command->email]); } } // Query Handler class GetUserQueryHandler { public function __construct(private PDO $pdo) {} public function handle(GetUserQuery $query): ?array { $stmt = $this->pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$query->userId]); return $stmt->fetch(PDO::FETCH_ASSOC); } }</code>3. Verwenden Sie einen Befehlsbus und einen Abfragebus:
Diese dienen als zentrale Punkte für die Versandbefehle und Abfragen an ihre jeweiligen Handler. Sie können sie mit einfachen Schnittstellen und Abhängigkeitsinjektion implementieren:
<code class="php">interface CommandBus { public function handle(object $command): void; } class SimpleCommandBus implements CommandBus { private array $handlers; public function __construct(array $handlers) { $this->handlers = $handlers; } public function handle(object $command): void { $handlerClass = get_class($command) . 'Handler'; if (isset($this->handlers[$handlerClass])) { $handler = $this->handlers[$handlerClass]; $handler->handle($command); } else { throw new \Exception("Handler not found for command: " . get_class($command)); } } } //Similar implementation for QueryBus</code>4. Implementieren Sie die Ereignisbeschaffung (optional):
Für eine erhöhte Flexibilität und Überprüfbarkeit, sollten Sie die Ereignisbeschaffung verwenden. Anstatt die Datenbank direkt zu aktualisieren, generieren die Befehle, die gespeichert werden. Abfragen rekonstruieren dann den aktuellen Zustand aus dem Ereignisstrom.
Das obige ist der detaillierte Inhalt vonWie benutze ich CQRs (Befehlsabfrageverantwortung Segregation) in Php 8?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!