在Drupal 7(和Drupal 6?)系统中,什么“启动”钩子调用过程,或“顶级”钩子调用位于何处?
我目前了解Drupal模块系统,任何模块都能够为另一个模块创建一个钩子来实现。这意味着Drupal的大部分执行都是为其他模块实现钩子的模块,这反过来又为其他模块提供了钩子来实现。
我不清楚的是,是否有一个初始的顶级钩子在引导程序中调用以启动此过程,或者是否有几个非模块调用启动钩子调用过程,或者某些东西否则(道歉是这是模糊和新的,但就像我说我不明白)
我查看了_drupal_bootstrap_full
函数,最后有一个很有希望的
module_invoke_all('init');
但是,我对modules/
文件夹的搜索只显示了一个“init”钩子函数,这似乎不是一个启动点
system/system.api.php
1737:function hook_init() {
function hook_init() {
drupal_add_css(drupal_get_path('module', 'book') . '/book.css');
}
所以,那对我说模块系统之外的东西就把这一切都搞砸了。这是发生在一个地方,还是多个地方。这些地方在哪里?
我目前不是一个沉重的Drupal用户。我所有这一切的最终目标是理解Drupal的模块系统孤立,这样我就可以调查并理解Drupal如何使用它的模块构建大多数人认为是Drupal的应用程序。欢迎任何/所有解释,但我试图从架构的角度理解事物。我知道你不需要这些知识来使用Drupal,但是我的大脑已经坏了,在我知道基本的PHP代码在做什么之前我不会让我前进。
答案 0 :(得分:5)
钩子系统是Drupal内部的一个独立系统。它不负责引导。 hook_init()只是在引导过程结束时调用的钩子。正如另一个答案所说,module_invoke_all()可以随时随地调用。
简单地说,在Drupal 7中,index.php中的以下两行负责请求的基本流程:
<?php
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();
?>
可以将其翻译成两个步骤:
引导系统。这包括加载所有模块和必要的包含文件,数据库连接等。
查找负责此请求的菜单路由器项并执行它。
有人开始撰写一系列博客文章以更详细地描述它,请参阅http://becircle.com/blog_topics/line_line。
答案 1 :(得分:0)
module_invoke_all就是这一切发生的地方。
来自doc:在实现它的所有已启用模块中调用一个钩子。
初始化可能不是一个很好的,因为很少有人定义它。另外,请记住,钩子被称为而不是钩子。
编辑:
/**
* Deletes a node type from the database.
*
* @param $type
* The machine-readable name of the node type to be deleted.
*/
function node_type_delete($type) {
$info = node_get_types('type', $type);
db_query("DELETE FROM {node_type} WHERE type = '%s'", $type);
module_invoke_all('node_type', 'delete', $info);
}
这是在D6 node.module中。这是一个从模块代码调用钩子的例子,在本例中是hook_node_type,带有两个参数。