検索
ホームページバックエンド開発PHPチュートリアルPHP でのイベント駆動型アーキテクチャの実装: イベント ソーシングと CQRS の詳細

Implementing Event-Driven Architectures in PHP: A Deep Dive into Event Sourcing and CQRS

イベント駆動型アーキテクチャ (EDA) は、システムを切り離し、イベントに応答することでシステムの柔軟性、拡張性、保守性を高めることに重点を置いています。 PHP では、EDA でよく使用される 2 つの重要なパターンは、イベント ソーシングコマンド クエリ責任分離 (CQRS) です。ここでは、PHP を使用してこれらを実装するためのステップバイステップのガイドと実際の例を示します。

概念の概要

1. イベントソーシング:

  • アプリケーションの最終状態だけをデータベースに保存するのではなく、アプリケーションの状態に対するすべての変更 (イベント)が保存されます。
  • : 注文システムがある場合、最新の注文ステータスのみを保存するのではなく、「注文が作成されました」、「商品が追加されました」、「注文が支払われた」など、注文に関するすべてのアクションを保存します。

2.CQRS:

  • CQRS は、read (クエリ) 操作と write (コマンド) 操作を分離します。 2 つのモデルは別々に進化する可能性があり、書き込みモデルはビジネス ロジックと検証に重点を置き、読み取りモデルはデータ表現に重点を置きます。
  • : 電子商取引サイトのような複雑なシステムの場合、注文を行うロジック (書き込み) と注文の詳細を取得するロジック (読み取り) を分離できます。

アーキテクチャフロー

  1. コマンド:

    • コマンドは、状態の変更を要求するアクションです (例: "PlaceOrder"、"AddItemToOrder")。
    • コマンドは、ビジネス ロジックを実行してイベントを発行する コマンド ハンドラー によって処理されます。
  2. イベント:

    • コマンドが処理された後、何か重要なことが起こったことを表すイベント (例: "OrderPlaced"、"ItemAdded") が発生します。
    • イベントは不変であり、読み取りモデルの更新や外部システムへの通知など、システムの他の部分でアクションをトリガーします。
  3. モデルの読み取り:

    • 読み取りモデルはイベントに反応することで最新の状態に保たれます。読み取り操作用に最適化されており、書き込みモデルとは異なるスキーマを持つ場合があります。

段階的な例: 注文システム

ステップ 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;
        });
    }
}

部品ごとの内訳

  1. コマンド作成: 何かを変更するというユーザーの意図を表します。
  2. コマンド処理: コマンドを処理し、イベントを発生させるビジネス ロジック。
  3. イベント発行: コマンドが正常に処理された後に発生したイベント。
  4. イベント処理: 最適化されたクエリのためにイベント データを読み取りモデルに投影します。
  5. CQRS 分離: コマンド モデルはドメイン ロジックに重点を置き、クエリ モデルは高速検索用に最適化されています。
  6. イベント ストア: 必要に応じて、イベントを永続化して、必要に応じて状態を再生します。

結論

この例は、PHP での CQRSEvent Sourcing の簡単なアプリケーションを示しています。これらのパターンを使用すると、強力な監査機能と柔軟な読み取り/書き込み処理を提供しながら、拡張性に優れ、保守しやすいシステムを構築できます。このアーキテクチャは、追加のプロジェクション、より複雑なイベント処理、メッセージング キューやサードパーティ通知などの外部統合によって拡張できます。

以上がPHP でのイベント駆動型アーキテクチャの実装: イベント ソーシングと CQRS の詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
トラフィックの高いウェブサイトのPHPパフォーマンスチューニングトラフィックの高いウェブサイトのPHPパフォーマンスチューニングMay 14, 2025 am 12:13 AM

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

PHPでの依存関係注射:初心者向けのコード例PHPでの依存関係注射:初心者向けのコード例May 14, 2025 am 12:08 AM

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

PHPパフォーマンス:アプリケーションを最適化することは可能ですか?PHPパフォーマンス:アプリケーションを最適化することは可能ですか?May 14, 2025 am 12:04 AM

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

PHPパフォーマンスの最適化:究極のガイドPHPパフォーマンスの最適化:究極のガイドMay 14, 2025 am 12:02 AM

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

PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

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

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

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

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

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

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

SublimeText3 英語版

SublimeText3 英語版

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

SecLists

SecLists

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

SublimeText3 Mac版

SublimeText3 Mac版

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

Safe Exam Browser

Safe Exam Browser

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