2

これは、独自のフックを作成するために私が尋ねた別の質問 のフォローアップです。

回答とコメントでは、2つの機能が言及されました

module_invoke_all(...)
drupal_alter(...)

この関数module_invoke_allは、それを実装するモジュールのフックを呼び出すために使用されているようです。

この関数drupal_alterは、それを実装するモジュールのフックを呼び出し、すべてのフック関数間で永続的なデータ構造を渡すように見えます。

コードを掘り下げると、私も見つけました

module_invoke(...)

これにより、特定のモジュールで特定のフックを呼び出すことができるように見えます。

ですから、私の質問は本当に2つの質問です。まず、上記の項目についての私の理解は正しいですか。次に、モジュールに実装されたフックを呼び出すために使用できる他のコアDrupal関数はありますか?

私の最終目標は、Drupalのアーキテクチャーの各部分がどのように組み合わされて、ほとんどの人が使用するアプリケーションであるDrupalを形成するかをよりよく理解することです。私は、モジュールシステムを分離して理解しようとすることから始めています。明白な誤解に対する修正はありがたいです

4

1 に答える 1

4

最初の質問:はい。

2番目の質問:これらの関数を使用する以外に、module_implements()を直接呼び出して、手動で呼び出すこともできます。ユースケースの例は、参照によって引数を渡したいが、drupal_alter()が強制するhook_something_alter()命名スキームを望まない場合です。

module_implements()は、指定されたフックを実装したモジュールの配列を返します。Drupal 6では、これは単にすべてのモジュールをループし、関数$moduleかどうかをチェックするだけです。'_'。$hookが存在します。

Drupal 7では、たとえば、hook_yourmodule_somethingをanothermodule.yourmodule.incに含めることができるように定義すると、Drupalはそのファイルを自動的に検索し、必要に応じてインクルードします。hook_hook_infoを参照してください。さらに、フックを実装するモジュールのリストを変更することもできますが、これはかなりクレイジーであり、注意して使用する必要があります。hook_module_implements_alterを参照してください。

これらの機能により、検出がD6よりもかなり遅くなるため、それにキャッシュが追加されました。これは基本的に、D7でフックの実装を追加するたびに、キャッシュをクリアする必要があることを意味します。

手動実装の例:

<?php
// Custom hooks should always be prefixed with your module name to avoid naming conflicts.
$hook_name = 'yourmodule_something';
// Get a list of all modules implementing the hook.
foreach (module_implements($hook_name) as $module) {
  // Build the actual function name.
  $function = $module . '_' . $hook_name;
  // Call the function. Anything passed in to the function can be by-reference if the
  // hook_implementation defines it so. If you don't want that, you might want to give them
  // only a copy of the data to prevent abuse.
  $function($arg1, $arg2, $arg3, $arg4);
}
?>

質問でリンクした関数のコードを見ると、基本的に同じ手順のヘルパー関数であることがわかります。したがって、これはフック呼び出しの一般的な理解を向上させるのにも役立つはずです。

于 2011-02-14T21:42:05.893 に答える