Drupalのフックの原理


Drupalを最初から学ぶ--基本アーキテクチャ2
初心者コーナー
Drupal6.x
から
xeopnは土曜日、2008-06-21 00:11に提出されました.
前述したように、Drupalの論理層は1つのコアフレームワークと一連の機能モジュール(Module、プラグインと見なすことができる)から構成され、フレームワークとモジュール間の協調はフックメカニズムによって実現されるので、フックメカニズムはDrupalモジュール化システムの鍵である.フックメカニズムとは、オブジェクト向けインタフェース(Interface)と同様に、2つのエンティティ間の機能インタフェースを仕様に定義し、そのインタフェースを実現したエンティティが対話できるようにするものである.Drupalでは、フックはDrupalフレームワークとモジュールとが相互作用するインタフェースであるが、Drupalはオブジェクト向けのメカニズムがないため、プログラミング規約を採用して巧みに実現する.Drupalでは、フックは特定の機能を実現する必要がある一連の関数であり、入力パラメータと戻りタイプを約束し、xxx_yyy()の形式で命名する、xxxは機能を実現するモジュール名であり、yyyyは具体的なフック名である.例を挙げると、あなたはもっとはっきりしています.たとえばmyexamplemoduleというモジュールがあります.footerにJavascriptコードを追加したいので、モジュールコードにmyexamplemoduleというモジュールを実装します.footer()の関数は、この関数の中で私が望んでいる機能を実現しました.ユーザーがページを要求すると、Drupalのフレームワークは私のモジュールにmyexamplemoduleがあることを検出します.footer()関数は、自動的に呼び出されますが、簡単で分かりやすいのではないでしょうか.Drupalコアフレームワークのこのようなスケジューリングメカニズムは、ユーザーのカスタムモジュールとフレームワーク間の実際の相互作用を遮断し、開発を簡素化した.関数を1つ実現すれば、他のシステムが完成したからだ.詳細はDrupalのドキュメントライブラリを参照してください.
Hookメカニズムは主にモジュール管理(includes/module.inc)で実現され、主に4つの主要関数があり、非常に簡単である.
module_hook($module, $hook)
 
あるモジュールがフックを実現しているかどうかを判断する
 
module_implements($hook, $sort = FALSE, $refresh = FALSE)
 
どのモジュールがフックを実装し、モジュール名配列を返すかを判断します.
 
module_invoke()
 
特定のモジュールの特定のフックを呼び出し、パラメータを長くします.パラメータにはモジュール名、フック名、フック関数のパラメータが含まれます.
 
module_invoke_all()
 
すべてのモジュールの特定のフックを呼び出し、パラメータを長くします.パラメータにはフック名、フック関数のパラメータが含まれます.
 
moduleを見てみましょうinvoke_Bootstrapプロセス中にフレームワークによって呼び出される関数の具体的な実装.
  <?php
function module_invoke_all () {
      
$args = func_get_args ();
      
$hook = $args [ 0 ];
       unset(
$args [ 0 ]);
      
$return = array();
       foreach (
module_implements ( $hook ) as $module ) {
         
$function = $module . '_' . $hook ;
         
$result = call_user_func_array ( $function , $args );
          if (isset(
$result ) && is_array ( $result )) {
             
$return = array_merge_recursive ( $return , $result );
          }
         else if (isset(
$result )) {
            
$return [] = $result ;
         }
  }
  return
$return ;
}
?>

Drupalのフックは実現するのも比較的に柔軟で、あるフックを実現したくなくて、その関数を書かないで、このようにPHPファイルのコードを減らすことができて、効率を高めることができます.しかし、フック関数を実現するモジュールが呼び出されると、あるコンテンツが出力されると、他の関係のないモジュールがロードされ、実行するという膨大な感覚がある.要するに、粗浅に見ると、ここは個性がボトルネックになるはずだ.