DRUPAL 8:フックからシンフニーのイベントディスパッチャーへの移行
Drupal 8の多数のSymfonyコンポーネントの採用は、従来のDrupal方法論から現代のPHPアーキテクチャパターンへの移行を意味します。 この移行には、フックシステムをプラグイン、注釈、および強力なSymfonyイベントディスパッチャーに徐々に置き換えることが含まれます。
を実装し、A EventSubscriberInterface
メソッドを定義し、購読するイベントの配列を返します。
getSubscribedEvents
Drupal 8ではフックが持続しますが、多くの人がプラグイン、注釈、イベントディスパッチャーに取って代わられたため、それらの使用が減少しました。 ただし、特定のコア相互作用にはフックが重要です。 推奨事項は、リスナーの優先順位付け、イベントの伝播の停止、イベントデータの変更など、柔軟性と機能が強化されているため、実行可能なときはいつでもSymfonyイベントディスパッチャーを支持することです。 (注:元の記事のコードの例は、進行中のDrupal 8開発のために更新が必要になる場合があります。)
Symfony Webサイトで説明されているように、Symfonyイベントディスパッチャーは、イベントの派遣とリスニングを介して通信するためのアプリケーションコンポーネントのツールを提供します。 この記事では、Drupal 8の実装に焦点を当てています。 (その原則を包括的に理解するために、Symfonyのドキュメントを参照してください。)
実用的な例:
モジュールこの例では、カスタムDrupal 8モジュール(
)のイベントディスパッチャーを示しています。このモジュールには、2つのフィールドを持つ構成フォームが含まれています。 保存すると、構成オブジェクトを含むイベントがディスパッチされ、他のコンポーネントが持続前にインターセプトして変更できます。 最後に、イベントのサブスクライバーは、このイベントを聞いて反応することを示しています。 (DRUPAL 8モジュール開発の基本については、関連するチュートリアルを参照してください。)event_dispatcher_demo
event_dispatcher_demo
2つのテキストフィールド(および)を備えた単純な構成フォームが作成されます。 ルート(DemoForm.php
)を使用すると、URLを介してアクセスできます(例:
)my_name
my_website
フォームの送信ハンドラー(event_dispatcher_demo.routing.yml
)には次のものが含まれています
$dispatcher = Drupal::service('event_dispatcher');
(生産コードでは依存関係の注入が推奨されます)。
DemoEvent
Event
返されたイベントから変更された構成を取得し、保存します。
$dispatcher->dispatch('demo_form.save', $e);
このクラスはDemoEvent
を実装します。 DemoEvent.php
イベントをリッスンするための
既存の構成値に基づいて新しい構成値を追加します。 ConfigSubscriber.php
タグを備えたサービス定義(
Drupal 8EventSubscriberInterface
のフック
getSubscribedEvents
比較のために、この例は、フックを使用して同様の機能を達成する方法も示しています。 onConfigSave
メソッドは、demo_form.save
サービスを使用してonConfigSave
フックを呼び出すように変更されています。サンプルフックの実装(event_dispatcher_demo.services.yml
)は、構成値を追加することを示しています。
event_subscriber
結論
Symfonyイベントディスパッチャーは、従来のフックシステムと比較して、Drupal 8機能を拡張するためのより堅牢で保守可能なアプローチを提供します。フックは残っていますが、イベントディスパッチャーは新しい開発のための推奨される方法であり、より良い柔軟性、テスト可能性、およびコード組織を提供します。 このシフトは、Drupalが現代のPHPベストプラクティスを採用したことを反映しています。
よくある質問(FAQ)
submitForm
元の記事のFAQセクションはすでに十分に構造化されており、Drupal 8フックとSymfonyイベントディスパッチャーの違いと使用に関する一般的な質問に包括的に答えています。 ここには変更は必要ありません。demo_config_save
以上がDrupal 8フックとSymfonyイベントディスパッチャーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。