Drupal的模块挂钩呼叫在哪里开始?

时间:2011-02-14 20:06:00

标签: php drupal drupal-modules drupal-hooks

在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代码在做什么之前我不会让我前进。

2 个答案:

答案 0 :(得分:5)

钩子系统是Drupal内部的一个独立系统。它不负责引导。 hook_init()只是在引导过程结束时调用的钩子。正如另一个答案所说,module_invoke_all()可以随时随地调用。

简单地说,在Drupal 7中,index.php中的以下两行负责请求的基本流程:

<?php
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();
?>

可以将其翻译成两个步骤:

  1. 引导系统。这包括加载所有模块和必要的包含文件,数据库连接等。

  2. 查找负责此请求的菜单路由器项并执行它。

  3. 有人开始撰写一系列博客文章以更详细地描述它,请参阅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,带有两个参数。