Event-Driven Architecture (EDA) konzentriert sich darauf, Systeme zu entkoppeln und sie durch die Reaktion auf Ereignisse flexibler, skalierbarer und wartbarer zu machen. In PHP sind zwei wichtige Muster, die in EDA häufig verwendet werden, Event Sourcing und Command Query Responsibility Segregation (CQRS). Hier finden Sie eine Schritt-für-Schritt-Anleitung zur Implementierung mit PHP sowie ein praktisches Beispiel.
Befehl:
Ereignis:
Modell lesen:
Erstellen Sie eine Verzeichnisstruktur:
event-driven-php/ ├── src/ │ ├── Commands/ │ ├── Events/ │ ├── Handlers/ │ ├── Models/ │ └── ReadModels/ ├── tests/ └── vendor/
Abhängigkeiten installieren (z. B. Symfony/Event-Dispatcher):
composer require symfony/event-dispatcher
Befehle stellen Aktionen dar, die den Zustand ändern. Beispiel: 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; } }
Ereignisse beschreiben, was im System passiert ist. Beispiel: 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; } }
Befehlshandler führen die eigentliche Geschäftslogik aus und lösen Ereignisse aus. Beispiel: 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'); } }
Ein Event-Handler wartet auf bestimmte Ereignisse und aktualisiert das Lesemodell. Beispiel: 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);
Ausgabe:
Array ( [orderId] => 123 [customerId] => cust_001 [status] => placed )
Für eine vollständige Ereignisbeschaffung würden Sie auch einen Ereignisspeicher implementieren, um Ereignisse in einer Datenbank beizubehalten.
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; }); } }
Dieses Beispiel zeigt eine einfache Anwendung von CQRS und Event Sourcing in PHP. Mit diesen Mustern können Sie Systeme erstellen, die gut skalierbar und wartbar sind und gleichzeitig eine leistungsstarke Überprüfbarkeit und flexible Lese-/Schreibverarbeitung bieten. Die Architektur kann mit zusätzlichen Projektionen, komplexerer Ereignisbehandlung und externen Integrationen wie Messaging-Warteschlangen oder Benachrichtigungen von Drittanbietern wachsen.
Das obige ist der detaillierte Inhalt vonImplementierung ereignisgesteuerter Architekturen in PHP: Ein tiefer Einblick in Event Sourcing und CQRS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!