gpt4 book ai didi

Drupal 的引导/调度/路由流程

转载 作者:行者123 更新时间:2023-12-04 13:10:07 28 4
gpt4 key购买 nike

假设最小模块安装(为了简单起见),Drupal 的 index.php 中两个顶级功能的核心“职责”是什么? ?

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();

我试图从高层次上理解 Drupal 的核心系统是如何工作的,特别是与基于 Web 的 MVC 的关系。因此,在类似 Code Igniter 的系统中,以下内容
  • 检查 URL,将其转换为类和操作
  • 调用类的action方法,从模型中加载信息,“业务逻辑”完成
  • 信息被传递到 View 层
  • 布局系统呈现 HTML 页面
  • 部分布局(通常是“内容区域”)由步骤 3 中传递的信息驱动

  • Drupal 中等效的调度过程是什么?我了解模块系统的工作原理,但我不太遵循 Drupal 关于数据加载和主题/布局渲染的方式/原因以及两者之间的切换发生位置的哲学。

    我意识到 Drupal 与 Web 应用程序 MVC 系统完全不同。我试图了解如何。我意识到 Drupal 的设计目的是在没有完全理解这一点的情况下成功使用。优先考虑 Drupal 7 答案,但如果有来自以前版本的根本变化信息是受欢迎的。

    最佳答案

    Berdir 和 Apemantus 已经给出了很好的答案(+1),但还有一些空间可以进一步尝试:

    关于 Drupals 与 MVC 的关系,我用 this answer to a question for 'A metaphor for Drupal module's inner workings' 探讨了这个话题。 ,这可能符合您对“高级”概述的要求。

    至于顶级函数调用 - 好吧,有些东西只是三个,所以我建议使用 theme('page, $return)调用混合,因为这将完成概述:

    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
    $return = menu_execute_active_handler();

    // Menu status constants are integers; page content is a string.
    if (is_int($return)) {
    switch ($return) {
    // [...] Snipped error page handling code
    }
    }
    elseif (isset($return)) {
    // Print any value (including an empty string) except NULL or undefined:
    print theme('page', $return);
    }
    drupal_page_footer();

    逐个:
  • drupal_bootstrap()
    顾名思义,这主要与“设置舞台”有关,例如
  • 初始化基本配置
  • 初始化数据库访问
  • 初始化 session 处理
  • 识别请求用户
  • 最终通过提供缓存内容来缩短请求
  • ...(更多内容)

  • 这里很重要是已经在这个阶段,钩子(Hook)系统将调用其他模块,如果他们要求它,让他们有机会在这个早期阶段注入(inject)自定义逻辑。虽然模块这样做并不常见,但它增加了 Drupal 的灵 active ,可以满足特殊需求,例如影响用户识别过程,防止或强制缓存命中,重写请求的路径和其他“低级”操作。
  • menu_execute_active_handler()
    这与 CodeIgniter 草图中的步骤 1. 和 2. 大致匹配。它将检查请求的路径,将其与正确的回调函数匹配(包括一些“将通配符转换为参数”逻辑),并调用该回调,传递提取的(或预定义的)参数。回调通常期望返回主页内容,但可以自由地做其他事情,例如只是重定向请求。大多数“业务逻辑”将在此处完成,但请注意,返回的内容通常已经是标记片段,因此此阶段已经包含 View 层的某些部分!
  • theme_page() (通过 theme() 函数间接调用,这增加了很多周围的“魔法”)
    这(非常)与通常的 View 层大致匹配,因为这是要返回的标记的最终组装发生的地方。但它也是页面“周围”元素组合的地方(想想菜单、标题、侧边栏等),因此在这个阶段仍有很大的“业务逻辑”潜力。

  • 在所有这些步骤中,钩子(Hook)系统(以及类似设计的主题系统)将为其他模块“订阅”提供相当多的“钩子(Hook)”点,如果他们需要的话。当被调用时,它们将传递当时正在处理的相关信息,并可以选择介入并操纵它(或者只是触发一些单独的处理)。所有这些加起来是一个非常灵活的系统(因为自定义模块有大量的“拦截和操作”选项),但也造成了学习 Drupal 的许多困难,例如“什么时候发生”的问题通常不容易回答:/

    所以简单总结一下:
  • bootstrapping - 初始化繁重的工作,最终丰富了“业务逻辑”的早期入侵。
  • 执行 - 主要的“业务逻辑”处理,已经有一些“ View ”生成逻辑(标记片段的组装)。
  • 主题化 - 主要标记生成,“业务逻辑”的一些重要部分仍在混合中。
  • 关于Drupal 的引导/调度/路由流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5006274/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com