Rumah >pembangunan bahagian belakang >PHP8 >Bagaimana cara menggunakan CQRS (Pemisahan Tanggungjawab Pertanyaan Perintah) dalam Php 8?
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:
<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. Buat pengendali arahan dan pengendali pertanyaan:
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.
<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. Gunakan bas perintah dan bas pertanyaan:
Akta ini sebagai titik pusat untuk menghantar arahan dan pertanyaan kepada pengendali masing -masing. Anda boleh melaksanakannya menggunakan antara muka mudah dan suntikan ketergantungan:
<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>Untuk peningkatan fleksibiliti dan kebolehlaksanaan, pertimbangkan untuk menggunakan penyumberan acara. Daripada mengemas kini pangkalan data secara langsung, arahan menjana peristiwa yang disimpan. Pertanyaan kemudian membina semula keadaan semasa dari aliran acara.
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!