L'architecture pilotée par les événements (EDA) se concentre sur le découplage des systèmes et sur leur capacité à les rendre plus flexibles, évolutifs et maintenables en répondant aux événements. En PHP, deux modèles importants qui sont souvent utilisés dans EDA sont Event Sourcing et Command Query Responsibility Segregation (CQRS). Voici un guide étape par étape pour les implémenter à l’aide de PHP, ainsi qu’un exemple pratique.
Commande :
Événement :
Lire le modèle :
Créez une structure de répertoires :
event-driven-php/ ├── src/ │ ├── Commands/ │ ├── Events/ │ ├── Handlers/ │ ├── Models/ │ └── ReadModels/ ├── tests/ └── vendor/
Installer les dépendances (par exemple, symfony/event-dispatcher) :
composer require symfony/event-dispatcher
Les commandes représentent des actions qui changent l'état. Exemple : PlaceOrderCommand.php.
// src/Commands/PlaceOrderCommand.php class PlaceOrderCommand { public string $orderId; public string $customerId; public function __construct(string $orderId, string $customerId) { $this->orderId = $orderId; $this->customerId = $customerId; } }
Les événements décrivent ce qui s'est passé dans le système. Exemple : OrderPlacedEvent.php.
// src/Events/OrderPlacedEvent.php class OrderPlacedEvent { public string $orderId; public string $customerId; public function __construct(string $orderId, string $customerId) { $this->orderId = $orderId; $this->customerId = $customerId; } }
Les gestionnaires de commandes exécutent la logique métier réelle et déclenchent des événements. Exemple : PlaceOrderHandler.php.
// src/Handlers/PlaceOrderHandler.php use Symfony\Component\EventDispatcher\EventDispatcher; class PlaceOrderHandler { private EventDispatcher $eventDispatcher; public function __construct(EventDispatcher $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } public function handle(PlaceOrderCommand $command) { // Business logic (e.g., check stock, validate order) // Emit the event $event = new OrderPlacedEvent($command->orderId, $command->customerId); $this->eventDispatcher->dispatch($event, 'order.placed'); } }
Un gestionnaire d'événements écoute des événements spécifiques et met à jour le modèle de lecture. Exemple : OrderProjection.php.
// src/ReadModels/OrderProjection.php class OrderProjection { private array $orders = []; public function onOrderPlaced(OrderPlacedEvent $event) { // Save or update read model with necessary data $this->orders[$event->orderId] = [ 'orderId' => $event->orderId, 'customerId' => $event->customerId, 'status' => 'placed' ]; } public function getOrder(string $orderId) { return $this->orders[$orderId] ?? null; } }
use Symfony\Component\EventDispatcher\EventDispatcher; // Bootstrapping the system $dispatcher = new EventDispatcher(); $orderProjection = new OrderProjection(); // Register event listeners $dispatcher->addListener('order.placed', [$orderProjection, 'onOrderPlaced']); // Create the command and command handler $command = new PlaceOrderCommand('123', 'cust_001'); $handler = new PlaceOrderHandler($dispatcher); // Handle the command (Place the order) $handler->handle($command); // Query the read model for the order $order = $orderProjection->getOrder('123'); print_r($order);
Sortie :
Array ( [orderId] => 123 [customerId] => cust_001 [status] => placed )
Pour un sourcing complet d'événements, vous devez également implémenter un magasin d'événements pour conserver les événements dans une base de données.
class EventStore { private array $storedEvents = []; public function append(Event $event) { $this->storedEvents[] = $event; } public function getEventsForAggregate(string $aggregateId): array { return array_filter($this->storedEvents, function($event) use ($aggregateId) { return $event->aggregateId === $aggregateId; }); } }
Cet exemple démontre une application simple de CQRS et de Event Sourcing en PHP. Avec ces modèles, vous pouvez créer des systèmes bien évolutifs et maintenables, tout en offrant une auditabilité puissante et une gestion flexible de la lecture/écriture. L'architecture peut évoluer avec des projections supplémentaires, une gestion des événements plus complexe et des intégrations externes telles que des files d'attente de messagerie ou des notifications tierces.
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!