> 1。定義命令和查詢:命令表示改變應用程序狀態的操作。它們應該是簡單的原子操作。另一方面,查詢是檢索數據的只讀操作。 在PHP中,您可以使用類:
<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表示這些。創建命令處理程序和查詢處理程序:
>分別負責處理命令和查詢。 命令處理程序通常會與持久性層(例如數據庫)進行交互以更新數據。查詢處理程序從持久性層或其他來源檢索數據。
<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。使用命令總線和查詢總線:
這些作為向其各自處理人員派遣命令和查詢的中心點。 您可以使用簡單的接口和依賴項注入來實現它們:
<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。實施事件採購(可選):
以提高靈活性和可審核性,請考慮使用事件採購。 命令不是直接更新數據庫,而是生成存儲的事件。 然後,查詢然後從事件流中重建當前狀態。 >在PHP 8應用程序中實施CQR的最佳實踐是什麼?
>請記住,請記住在採用CQR之前仔細評估項目的需求。 這是一種強大的模式,但應明智地使用。
以上是如何在PHP 8中使用CQR(命令查詢責任隔離)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!