【问题标题】:Where is Drupal's Module Hook Calling Started?Drupal 的模块挂钩调用从哪里开始?
【发布时间】:2023-03-30 07:16:01
【问题描述】:

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

【问题讨论】:

    标签: php drupal drupal-modules drupal-hooks


    【解决方案1】:

    钩子系统是 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

    【讨论】:

    • 知道了。我的印象是引导加载一些全局资源,然后使用模块实现整个系统。显然不是这样。
    【解决方案2】:

    module_invoke_all 是一切发生的地方。

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

    初始化可能不是一个好的,因为很少有人定义它。另外,请记住,钩子称为 而不是钩子

    编辑:

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

    【讨论】:

    • 但是来自模块系统外部的东西需要调用初始 module_invoke_all,对吗?这就是我想要解决的问题。
    • 好的,在你的例子中,什么叫 node_type_delete?
    • Alan:这与回答您的问题无关。你可以编写一个调用函数 node_type_delete 的模块,而所有实现 hook_node_type_delete() 的模块仍然会触发它们的钩子。
    • Alan: module_invoke_all 就是所谓的 node_type_delete。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多