欠けていた情報を見つけました。
編集:そしてもう一つ。
module_invoke()の問題
module_invoke_all()
は常にを呼び出しますmodule_implements()
。これにより、hook_hook_info()
およびの両方がチェックされ、モジュールインクルードファイルがチェックされますhook_module_implements_alter()
。
ただし、module_invoke()
チェックのみであり、チェックはhook_hook_info()
行いません hook_module_implements_alter()
。
module_invoke()
たとえば_block_render_blocks()
forで呼び出されhook_block_view()
ます。これはhook_module_implements_alter()
、hook_block_view()
実装を個別のファイルに分割するための適切なソリューションではないことを意味します。
これはCrumbsの問題でした。https: //www.drupal.org/node/2328535を参照してください。
他のフックの場合、通常は問題なく動作しますが、特定のモジュールがのmodule_invoke()
代わりに使用したいかどうかはわかりませんmodule_invoke_all()
。
ブートストラップで汚染されたmodule_implements()キャッシュ。
別の問題は、ここで報告されているコアの問題が原因です
。module_implements_cache()は、module_invoke_all()を直接または間接的に呼び出すhook_boot()実装によって汚染される可能性があります
これは、の実装が検出されないことがある非ブートモジュールにのみ適用hook_module_implements_alter()
されます。
- 予期しない一連のイベントにより、
module_implements($hook)
から呼び出されhook_boot()
ます。任意のランダムなフックすることができ、それは我々が取り組んでいるモジュールに関連する必要はありません。
$hook
- これ
module_implements('module_implements_alter')
が呼び出されます。
- Drupalはのすべての実装を探します
hook_module_implements_alter()
。現時点でMODULENAME.module
は、まだ含まれていません。
したがって、残りのリクエストでは、Drupalは実装MODULENAME_module_implements_alter()
が存在しないと想定します。
- リクエストの後半で、他のフックの実装が発見されていますが、MODULENAMEによる実装は実行されていないため、見つかり
MODULENAME_module_implements_alter()
ません。
代替案
require_once
代替案はすでに言及されています。これらのトリックの代わりに、ファイルを直接含めることができます。小さなパフォーマンスへの影響があるかもしれませんが、これは恐らくDrupalの他の多くの事柄によって影に隠れています。
しかし、を使用する代わりにmodule_load_include()
、より直接的な解決策を提案します。
require_once __DIR__ . '/crumbs.block.inc';
または、PHP 5.2互換にするには:
require_once dirname(__FILE__) . '/crumbs.block.inc';
なぜmodule_load_include()をしないのですか?
module_load_include()
* .moduleファイルがyou-dont-know-where(例:からsettings.php
)からインクルードされていて、それmodule_load_include()
が利用可能かどうかわからない場合、通常はを呼び出す必要はありません。
この関数は主に、他のモジュールの場所を特定するのに役立ちます。ただし、同じモジュール内に含める場合は、相対ファイルパスと明示的なファイルを使用する方が一般に安全かつ簡単で高速require_once
です。
ヘルパー関数の呼び出し
Jimajammaで述べたように、メイン*.module
ファイルにフックを実装し、別のファイルをインクルードして、そこからヘルパー関数を呼び出すこともできます。これは、たとえばDisplay suiteで行われます。
この解決策は問題ありませんが、メインファイルが雑然としていて、さらに多くの場所を見ることができると思います。
またmodule_load_include()
、同じモジュール内にある場合は、の代わりにrequire_onceを使用することもできます。