这是a followup我问你创建自己的钩子的另一个问题。
在答案和评论中,提到了两个功能
module_invoke_all(...)
drupal_alter(...)
函数module_invoke_all
似乎用于为实现它的任何模块调用钩子。
函数drupal_alter
似乎为任何实现它的模块调用一个钩子和在所有钩子函数之间传递持久数据结构。
挖掘代码,我也找到了
module_invoke(...)
似乎允许您调用特定模块中的特定挂钩。
所以,我的问题实际上是两个问题。首先,是我对上述项目的理解是正确的。第二,是否有任何其他核心Drupal函数可用于调用模块中实现的钩子?
我的最终目标是更好地理解Drupal的架构如何组合在一起形成Drupal,即大多数人使用它的应用程序。我开始尝试孤立地理解模块系统。 赞赏对明显误解的任何更正
答案 0 :(得分:4)
第一个问题:是的。
第二个问题:除了使用这些功能外,您还可以直接呼叫module_implements()并手动调用它们。示例用例是指您希望通过引用传递参数但不希望drupal_alter()强制进入的hook_something_alter()命名方案。
module_implements()返回实现给定钩子的模块数组。在Drupal 6中,这只是一个遍历所有模块的循环,然后检查函数$ module。 '_'。 $ hook存在。
在Drupal 7中,例如可以定义你的hook_yourmodule_something可以在另一个模块中.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);
}
?>
如果你查看你在问题中链接的函数的代码,你可以看到它们基本上只是同一程序的辅助函数,所以这也应该有助于提高对钩子调用的一般理解。