イベント駆動型アーキテクチャ (EDA) は、システムを切り離し、イベントに応答することでシステムの柔軟性、拡張性、保守性を高めることに重点を置いています。 PHP では、EDA でよく使用される 2 つの重要なパターンは、イベント ソーシング と コマンド クエリ責任分離 (CQRS) です。ここでは、PHP を使用してこれらを実装するためのステップバイステップのガイドと実際の例を示します。
概念の概要
1. イベントソーシング:
- アプリケーションの最終状態だけをデータベースに保存するのではなく、アプリケーションの状態に対するすべての変更 (イベント)が保存されます。
- 例: 注文システムがある場合、最新の注文ステータスのみを保存するのではなく、「注文が作成されました」、「商品が追加されました」、「注文が支払われた」など、注文に関するすべてのアクションを保存します。
2.CQRS:
- CQRS は、read (クエリ) 操作と write (コマンド) 操作を分離します。 2 つのモデルは別々に進化する可能性があり、書き込みモデルはビジネス ロジックと検証に重点を置き、読み取りモデルはデータ表現に重点を置きます。
- 例: 電子商取引サイトのような複雑なシステムの場合、注文を行うロジック (書き込み) と注文の詳細を取得するロジック (読み取り) を分離できます。
アーキテクチャフロー
-
コマンド:
- コマンドは、状態の変更を要求するアクションです (例: "PlaceOrder"、"AddItemToOrder")。
- コマンドは、ビジネス ロジックを実行してイベントを発行する コマンド ハンドラー によって処理されます。
-
イベント:
- コマンドが処理された後、何か重要なことが起こったことを表すイベント (例: "OrderPlaced"、"ItemAdded") が発生します。
- イベントは不変であり、読み取りモデルの更新や外部システムへの通知など、システムの他の部分でアクションをトリガーします。
-
モデルの読み取り:
- 読み取りモデルはイベントに反応することで最新の状態に保たれます。読み取り操作用に最適化されており、書き込みモデルとは異なるスキーマを持つ場合があります。
段階的な例: 注文システム
ステップ 1: プロジェクトのセットアップ
ディレクトリ構造を作成します:
event-driven-php/ ├── src/ │ ├── Commands/ │ ├── Events/ │ ├── Handlers/ │ ├── Models/ │ └── ReadModels/ ├── tests/ └── vendor/
依存関係をインストールします (例: symfony/event-dispatcher):
composer require symfony/event-dispatcher
ステップ 2: コマンドを定義する
コマンドは状態を変更するアクションを表します。例: 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; } }
ステップ 3: イベントを作成する
イベントはシステム内で何が起こったかを説明します。例: 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; } }
ステップ 4: コマンド ハンドラー
コマンド ハンドラーは実際のビジネス ロジックを実行し、イベントを発生させます。例: 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'); } }
ステップ 5: イベント ハンドラー (モデルを読み取るためのデータの投影)
イベント ハンドラーは特定のイベントをリッスンし、読み取りモデルを更新します。例: 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; } }
ステップ 6: 組み立てる
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 )
ステップ 7: イベント ストア (オプション)
完全なイベント ソーシングの場合は、イベントをデータベースに保存するための イベント ストア も実装します。
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; }); } }
部品ごとの内訳
- コマンド作成: 何かを変更するというユーザーの意図を表します。
- コマンド処理: コマンドを処理し、イベントを発生させるビジネス ロジック。
- イベント発行: コマンドが正常に処理された後に発生したイベント。
- イベント処理: 最適化されたクエリのためにイベント データを読み取りモデルに投影します。
- CQRS 分離: コマンド モデルはドメイン ロジックに重点を置き、クエリ モデルは高速検索用に最適化されています。
- イベント ストア: 必要に応じて、イベントを永続化して、必要に応じて状態を再生します。
結論
この例は、PHP での CQRS と Event Sourcing の簡単なアプリケーションを示しています。これらのパターンを使用すると、強力な監査機能と柔軟な読み取り/書き込み処理を提供しながら、拡張性に優れ、保守しやすいシステムを構築できます。このアーキテクチャは、追加のプロジェクション、より複雑なイベント処理、メッセージング キューやサードパーティ通知などの外部統合によって拡張できます。
以上がPHP でのイベント駆動型アーキテクチャの実装: イベント ソーシングと CQRS の詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。
