6

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

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();

我试图从高层次上理解 Drupal 的核心系统是如何工作的,特别是与基于 Web 的 MVC 的关系。因此,在类似 Code Igniter 的系统中,以下内容

  1. 检查 URL,把它变成一个类和动作

  2. 调用类的action方法,从模型中加载信息,完成“业务逻辑”

  3. 信息被传递到视图层

  4. 布局系统呈现 HTML 页面

  5. 部分布局(通常是“内容区域”)由步骤 3 中传递的信息驱动

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

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

4

3 回答 3

14

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

关于 Drupal 与 MVC 的关系,我对“Drupal 模块内部工作的隐喻”这个问题的答案进行了深入探讨,这可能符合您对“高级”概述的要求。

至于顶级函数调用 - 好吧,有些东西只是三个,所以我建议将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();

逐个:

  1. drupal_bootstrap()
    顾名思义,这主要与“设置舞台”有关,即例如

    • 初始化基本配置
    • 初始化数据库访问
    • 初始化会话处理
    • 识别请求用户
    • 最终通过提供缓存内容来缩短请求
    • ... (更多东西)

    这里重要的一点是,已经在这个阶段,钩子系统将调用其他模块,如果他们要求的话,让他们有机会在这个早期阶段注入自定义逻辑。虽然模块这样做并不常见,但它增加了 Drupal 的灵活性,可以满足特殊需求,例如影响用户识别过程、防止或强制缓存命中、重写请求的路径和其他“低级别” ' 操纵。

  2. menu_execute_active_handler()
    这与 CodeIgniter 草图中的步骤 1. 和 2. 大致匹配。它将检查请求的路径,将其与正确的回调函数匹配(包括一些“将通配符转换为参数”逻辑),并调用该回调,传递提取的(或预定义的)参数。回调通常期望返回主页内容,但可以自由地做其他事情,例如重定向请求。大多数“业务逻辑”将在此处完成,但请注意,返回的内容通常已经是标记片段,因此此阶段已经包含视图层的某些部分!

  3. theme_page()(通过函数间接调用theme(),这增加了很多周围的“魔法”)
    这(非常)大致匹配通常的视图层,因为这是要返回的标记的最终组装发生的地方。但它也是页面“周边”元素组合的地方(想想菜单、标题、侧边栏等),因此在这个阶段仍有很大的“业务逻辑”潜力。

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

所以简单总结一下:

  1. bootstrapping - 初始化繁重的工作,最终丰富了“业务逻辑”的早期入侵。
  2. 执行 - 主要的“业务逻辑”处理,已经有一些“视图”生成逻辑(标记片段的组装)。
  3. 主题化 - 主要标记生成,“业务逻辑”的一些重要部分仍在混合中。
于 2011-02-15T23:03:59.053 回答
3

看看http://drupaldepth.blogspot.com/2009/07/flow-of-drupal.html

于 2011-02-15T16:51:50.270 回答
3

在引导之后,唯一发生的事情是菜单路由器系统,它确定哪个页面回调负责这个请求。为此,它依赖于所有已安装模块在其hook_menu()定义中返回的信息(该信息存储在数据库中,并且仅在明确请求时才更新,例如启用新模块时)。

那个钩子可以控制很多。例如访问权限、定义参数、菜单链接的标题等等。此外,菜单路由器几乎可以像您想要的一样复杂,它们不限于通常的控制器/动作模式。我认为您可以定义最多 9 个元素的菜单路由器项,例如“yourmodule/view/%/sub/%/%/whatever”。

有关示例的简短概述,请参见http://drupal.org/node/109131 。

在该页面回调中,提供模块可以自由地做它想做的任何事情。如果它愿意,它可以使用主题系统,触发钩子或对页面的“内容”部分做任何其他事情。主题系统将包括主题页面的所有其他部分,包括其他区域和自动包含在这些区域中的其他块。在创建响应 AJAX 请求或提供诸如 xml 提要等内容的回调时记住这一点很重要。在这些情况下,您需要采取进一步的步骤来调整主题以适应不应包含“其余”的请求这页纸。

于 2011-02-15T17:29:21.670 回答