4

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

4

2 回答 2

5

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

简而言之,在 Drupal 7 中,index.php 中的以下两行负责非常基本的请求流程:

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

这可以翻译成两个步骤:

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

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

有人开始了一系列博客文章来更详细地描述它,请参阅http://becircle.com/blog_topics/line_line

于 2011-02-14T20:38:09.117 回答
0

module_invoke_all 是一切发生的地方。

来自文档:在实现它的所有启用模块中调用一个钩子。

Init 可能不是一个好的,因为很少有人定义它。另外,请记住 hooks 被调用而不是 hook

编辑:

/**
 * 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,带有两个参数。

于 2011-02-14T20:10:00.723 回答