Drupalのフックの原理
5453 ワード
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プロセス中にフレームワークによって呼び出される関数の具体的な実装.
Drupalのフックは実現するのも比較的に柔軟で、あるフックを実現したくなくて、その関数を書かないで、このようにPHPファイルのコードを減らすことができて、効率を高めることができます.しかし、フック関数を実現するモジュールが呼び出されると、あるコンテンツが出力されると、他の関係のないモジュールがロードされ、実行するという膨大な感覚がある.要するに、粗浅に見ると、ここは個性がボトルネックになるはずだ.
初心者コーナー
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ファイルのコードを減らすことができて、効率を高めることができます.しかし、フック関数を実現するモジュールが呼び出されると、あるコンテンツが出力されると、他の関係のないモジュールがロードされ、実行するという膨大な感覚がある.要するに、粗浅に見ると、ここは個性がボトルネックになるはずだ.