> 1。定义命令和查询:命令表示改变应用程序状态的操作。它们应该是简单的原子操作。另一方面,查询是检索数据的只读操作。 在PHP中,您可以使用类:
// Command class CreateUserCommand { public function __construct(public string $name, public string $email) {} } // Query class GetUserQuery { public function __construct(public int $userId) {} }
>分别负责处理命令和查询。 命令处理程序通常会与持久性层(例如数据库)进行交互以更新数据。查询处理程序从持久性层或其他来源检索数据。
// 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); } }
这些作为向其各自处理人员派遣命令和查询的中心点。 您可以使用简单的接口和依赖项注入来实现它们:
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
以提高灵活性和可审核性,请考虑使用事件采购。 命令不是直接更新数据库,而是生成存储的事件。 然后,查询然后从事件流中重建当前状态。>在PHP 8应用程序中实施CQR的最佳实践是什么?
>请记住,请记住在采用CQR之前仔细评估项目的需求。 这是一种强大的模式,但应明智地使用。
以上是如何在PHP 8中使用CQR(命令查询责任隔离)?的详细内容。更多信息请关注PHP中文网其他相关文章!