イベント駆動型アーキテクチャ (EDA) は、システムを切り離し、イベントに応答することでシステムの柔軟性、拡張性、保守性を高めることに重点を置いています。 PHP では、EDA でよく使用される 2 つの重要なパターンは、イベント ソーシング と コマンド クエリ責任分離 (CQRS) です。ここでは、PHP を使用してこれらを実装するためのステップバイステップのガイドと実際の例を示します。
コマンド:
イベント:
モデルの読み取り:
ディレクトリ構造を作成します:
event-driven-php/ ├── src/ │ ├── Commands/ │ ├── Events/ │ ├── Handlers/ │ ├── Models/ │ └── ReadModels/ ├── tests/ └── vendor/
依存関係をインストールします (例: symfony/event-dispatcher):
composer require symfony/event-dispatcher
コマンドは状態を変更するアクションを表します。例: 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; } }
イベントはシステム内で何が起こったかを説明します。例: 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; } }
コマンド ハンドラーは実際のビジネス ロジックを実行し、イベントを発生させます。例: 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'); } }
イベント ハンドラーは特定のイベントをリッスンし、読み取りモデルを更新します。例: 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);
出力:
Array ( [orderId] => 123 [customerId] => cust_001 [status] => placed )
完全なイベント ソーシングの場合は、イベントをデータベースに保存するための イベント ストア も実装します。
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; }); } }
この例は、PHP での CQRS と Event Sourcing の簡単なアプリケーションを示しています。これらのパターンを使用すると、強力な監査機能と柔軟な読み取り/書き込み処理を提供しながら、拡張性に優れ、保守しやすいシステムを構築できます。このアーキテクチャは、追加のプロジェクション、より複雑なイベント処理、メッセージング キューやサードパーティ通知などの外部統合によって拡張できます。
以上がPHP でのイベント駆動型アーキテクチャの実装: イベント ソーシングと CQRS の詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。