1. Tentukan Perintah dan Pertanyaan:
Perintah mewakili tindakan yang mengubah keadaan permohonan. Mereka harus mudah, operasi atom. Pertanyaan, sebaliknya, adalah operasi baca sahaja yang mengambil data. Dalam PHP, anda boleh mewakili ini menggunakan kelas:
// Command class CreateUserCommand { public function __construct(public string $name, public string $email) {} } // Query class GetUserQuery { public function __construct(public int $userId) {} }
Ini bertanggungjawab untuk memproses arahan dan pertanyaan, masing -masing. Pengendali perintah biasanya berinteraksi dengan lapisan kegigihan (mis., Pangkalan data) untuk mengemas kini data. Pengendali pertanyaan mengambil data dari lapisan kegigihan atau sumber lain.
// 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); } }
Akta ini sebagai titik pusat untuk menghantar arahan dan pertanyaan kepada pengendali masing -masing. Anda boleh melaksanakannya menggunakan antara muka mudah dan suntikan ketergantungan:
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
Atas ialah kandungan terperinci Bagaimana cara menggunakan CQRS (Pemisahan Tanggungjawab Pertanyaan Perintah) dalam Php 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!