Rumah > pembangunan bahagian belakang > PHP8 > Bagaimana cara menggunakan CQRS (Pemisahan Tanggungjawab Pertanyaan Perintah) dalam Php 8?

Bagaimana cara menggunakan CQRS (Pemisahan Tanggungjawab Pertanyaan Perintah) dalam Php 8?

Karen Carpenter
Lepaskan: 2025-03-10 16:10:15
asal
982 orang telah melayarinya

Cara menggunakan CQRS (Pemisahan Tanggungjawab Pertanyaan Perintah) dalam Php 8? Pemisahan ini membawa kepada seni bina yang lebih diselenggara dan berskala. Berikut adalah pecahan bagaimana untuk melakukannya:

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) {}
}
Salin selepas log masuk
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.

// 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);
    }
}
Salin selepas log masuk
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:

4. Melaksanakan Penyumberan Acara (Pilihan):
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
Salin selepas log masuk
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.
  • Pastikan arahan dan pertanyaan mudah dan atom: Elakkan logik kompleks dalam pengendali. Memecahkan operasi besar ke dalam unit yang lebih kecil, bebas. Pangkalan data yang dioptimumkan membaca (seperti Redis atau Cassandra) boleh mengendalikan jumlah pertanyaan yang tinggi dengan lebih cekap. Ini menghalang operasi jangka panjang daripada menyekat benang aplikasi utama. Sourcing untuk domain kompleks:
  • Jika domain anda memerlukan tahap kebolehlaksanaan atau fleksibiliti yang tinggi, sumber peristiwa dapat bermanfaat. Dengan memisahkan operasi membaca dan menulis, anda boleh:
  • Mengoptimumkan pangkalan data untuk tugas -tugas tertentu:
  • Gunakan teknologi pangkalan data yang berbeza yang dioptimumkan untuk membaca dan menulis. Skala: Anda boleh dengan mudah membaca dan menulis operasi secara bebas. Berikut adalah beberapa perangkap biasa untuk mengelakkan:
    • over-engineering: Jangan memohon CQRS untuk aplikasi mudah di mana ia tidak diperlukan. Kerumitan tambahan mungkin melebihi manfaat. Ini mungkin memerlukan pengendalian yang berhati -hati terhadap konsistensi yang akhirnya. Ujian: Ujian menyeluruh adalah penting untuk memastikan integriti data dan fungsi yang betul. Pertimbangkan untuk menggunakan ujian unit, ujian integrasi, dan ujian akhir-ke-akhir. Ini corak yang kuat tetapi harus digunakan dengan bijak.

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan