Implémentation de CQRS dans PHP 8 implique la séparation des commandes (qui modifient les données) des requêtes (qui récupérent les données). Cette séparation conduit à une architecture plus maintenable et évolutive. Voici une ventilation de la façon de le faire:
1. Définir les commandes et les requêtes: Les commandes représentent des actions qui modifient l'état d'application. Ils devraient être des opérations atomiques simples. Les requêtes, en revanche, sont des opérations en lecture seule qui récupèrent les données. En PHP, vous pouvez les représenter en utilisant des classes:
// Command class CreateUserCommand { public function __construct(public string $name, public string $email) {} } // Query class GetUserQuery { public function __construct(public int $userId) {} }
2. Créer des gestionnaires de commandes et des gestionnaires de requête: Ceux-ci sont responsables du traitement des commandes et des requêtes, respectivement. Les gestionnaires de commandement interagissent généralement avec une couche de persistance (par exemple, une base de données) pour mettre à jour les données. Les gestionnaires de requête récupèrent les données de la couche de persistance ou d'autres sources.
// 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); } }
3. Utilisez un bus de commande et un bus de requête: Ceux-ci agissent comme des points centraux pour la répartition des commandes et des requêtes à leurs gestionnaires respectifs. Vous pouvez les implémenter en utilisant des interfaces simples et une injection de dépendance:
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
4. Implémentez l'approvisionnement en événements (facultatif): Pour une flexibilité et une auditabilité accrues, envisagez d'utiliser l'approvisionnement en événements. Au lieu de mettre à jour directement la base de données, les commandes génèrent des événements stockés. Les requêtes reconstruisent ensuite l'état actuel à partir du flux d'événements.
La mise en œuvre de CQR nécessite efficacement une planification minutieuse et une adhésion aux meilleures pratiques:
Optimiser les bases de données pour des tâches spécifiques:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!