Drupal でAOP (アスペクト指向プログラミング)はどのように機能しますか?
ログ記録とセキュリティに使用するという点で AOP について学びましたが、Drupal にはどのように適用されますか?
Drupal は、フックを介して AOP パラダイムを模倣します。これにより、基本的に、開発者は実行フロー中にコードのビットを織り込むことができます。Drupal ドキュメント サイトに表示されているDrupal フックのリストで、開発者が実装できるフックを確認できます。Drupal コアとそのモジュールから呼び出されるフックのみがリストされています。
簡単な例として、新しいノード ベースのモジュール (ノードは Drupal の基本的なデータ フォーム) を開発している場合、追加の作業をしなくても、コメントと分類法にすぐにアクセスできます。コメントおよび分類モジュールには、ノードにフックする機能があり、その追加機能を提供します。そういう意味では、プログラムでそのような機能を考慮する必要はありませんが、その柔軟性を利用することができます。
Drupal は「マルチパラダイム」フレームワークであり、その一部のみが「一種の」AOP を実装しています。
Drupal の AOP パラダイムは、イベント駆動型として視覚化する方が適切かもしれません。それはすべて、Drupal のフックの概念を通じて行われます。たとえば、次の操作を行う場合:
mymodule_init()
関数を作成しますあなたが宣言しているのは、疑似コードでは次のとおりです。
subscribe mymodule to "hook events" of type init
Drupal のコアが実行module_invoke_all('init')
されると、Drupal は次のように言っています。
notify all subscribers to "hook events" of type init that this has occurred
by passing any relevant arguments to them
and letting them run the code they define in their hook_init()
したがって、PHP は依然として手続き型言語であり、mymodule_init()
必要に応じてあらゆる種類のクレイジーでカプセル化されていないことを行うことができますが、Drupal は依然として責任を負っています。Drupal はある意味で、最初にコードを呼び出すかどうかを決定します。
このように、Drupal は、ジョイント ポイント(関数) を定義し、独自のポイントカット(命名規則が Drupal のフック名と一致する必要があるmodule_invoke*()
関数) を記述できるようにすることで、独自の実行フェーズを準 AOP に変えることができます。mymodule_*()
この背景、特に Drupal のマルチパラダイムの性質については、プログラミング言語のトレードオフ(Larry Garfield 著) を参照してください。