アプリケーションの開発では、アプリケーションがイベントに柔軟に反応できることが必要になることがよくあります。たとえば、特定のアクション (ユーザー登録など) が発生したときに複数のシステムに通知したいとします。ここで、パターン オブザーバーが登場します。このパターンを使用すると、オブジェクト間の関係を確立できるため、1 つの状態が変化すると、他のすべてのオブジェクトが自動的に通知され、更新されます。
Symfony はイベント ディスパッチャーのおかげでこのパターンをすでに効果的に実装しているため、プロジェクトで使用するのに非常に実用的で強力です。
パターン オブザーバーを使用すると、観察対象と 1 人以上のオブザーバーの間の関係を定義できます。観察対象のオブジェクトで状態の変化が発生すると、すべての観察者が通知を受けて、それに応じて対応できるようになります。
その仕組みは次のとおりです:
ユーザーが登録できるサイトがあると想像してみましょう。登録するたびに、ウェルカム メールを送信し、ユーザーをニュースレター リストに追加し、分析システムに通知する必要があります。
すべてを 1 か所で厳密にコーディングするのではなく、これらのタスクをさまざまなオブザーバーに委任して、「登録ユーザー」イベントがトリガーされるとすぐに通知を受けることができます。
Symfony では、イベント ディスパッチャーを使用してパターン オブザーバーをセットアップします。これにより、コードをきちんと整理し、基本的なロジックを変更せずに拡張可能にすることができます。
まず、ユーザーの登録時に送出されるイベントを作成します。後者にはユーザーの情報が含まれます。
ここで、コントローラーまたはサービスで、ユーザーの登録時にこのイベントをディスパッチします。
次に、登録イベントが送出されるたびに呼び出されるオブザーバーを作成する必要があります。ここでは、電子メールを送信し、ユーザーをニュースレター リストに追加する例を示します。
次に、リスナーが user.registered イベントをリッスンできるように、設定にリスナーを登録する必要があります。
config/services.yaml で、オブザーバーをサービスとして追加します。
ℹ️ Symfony のバージョン 5.3 以降、PHP 属性を使用してサービスとイベント リスナーを設定できます。これは、services.yaml ファイルを使用する代わりに、クラス内で直接イベントを宣言できる、より新しいアプローチです。
したがって、リスナー メソッドで #[AsEventListener] 属性を直接使用できます。
2 つのオブザーバーを属性で適応させる方法を示します (config/services.yaml で特別な設定は必要ありません? :
RegistrationController にユーザーを登録すると、イベントが送出され、Symfony は対応するオブザーバーを自動的に呼び出します。これらのアクション/ロジックがビジネス コードと混同されることなく、電子メールが送信され、ユーザーがニュースレター リストに追加されます。
それは必須だからです!これにより、アプリケーションは次のことが可能になります:
パターン オブザーバーは、イベントが重要な要素 (ドメイン イベント) である DDD (ドメイン駆動設計) に基づくアーキテクチャでよく使用されます。これらのイベントにより、システムのさまざまな部分 (多くの場合、メイン ドメインの外側) が反応できるようになります。ただし、これについては、DDD に関する将来の完全な記事で説明します!
以上がDesign Pattern Observer: 強力な通知システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。