5

Drupal でAOP (アスペクト指向プログラミング)はどのように機能しますか?

ログ記録とセキュリティに使用するという点で AOP について学びましたが、Drupal にはどのように適用されますか?

4

2 に答える 2

4

Drupal は、フックを介して AOP パラダイムを模倣します。これにより、基本的に、開発者は実行フロー中にコードのビットを織り込むことができます。Drupal ドキュメント サイトに表示されているDrupal フックのリストで、開発者が実装できるフックを確認できます。Drupal コアとそのモジュールから呼び出されるフックのみがリストされています。

簡単な例として、新しいノード ベースのモジュール (ノードは Drupal の基本的なデータ フォーム) を開発している場合、追加の作業をしなくても、コメントと分類法にすぐにアクセスできます。コメントおよび分類モジュールには、ノードにフックする機能があり、その追加機能を提供します。そういう意味では、プログラムでそのような機能を考慮する必要はありませんが、その柔軟性を利用することができます。

于 2008-09-24T23:29:13.567 に答える
2

Drupal は「マルチパラダイム」フレームワークであり、その一部のみが「一種の」AOP を実装しています。

  • たとえば、Drupal 7 の render() 関数は、基本的な優先順位規則に基づいて適切なテンプレートを選択することにより、ネストされた配列のセットを出力 HTML に変換します。このように、Drupal は XSLT 変換エンジンのように動作し、テーマのテンプレート ファイルが取得されます。一緒に入力 .xsl ファイルを構成し、入力配列のネストは初期の .xml ファイルです。これは、テーマの仕組みにエレガントで機能的な何かがあることを意味します。
  • また、D7 データベース抽象化レイヤーは「ストレートな」オブジェクト指向に近いですが、Larry (後述) が指摘しているように、この OO レイヤーには少量の準 AOP があります。

Drupal の AOP パラダイムは、イベント駆動型として視覚化する方が適切かもしれません。それはすべて、Drupal のフックの概念を通じて行われます。たとえば、次の操作を行う場合:

  • mymodule というモジュールを作成します。
  • mymodule.module で、mymodule_init()関数を作成します
  • このモジュールを Drupal にインストールします

あなたが宣言しているのは、疑似コードでは次のとおりです。

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 著) を参照してください。

于 2012-07-11T12:11:07.227 に答える