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();
逐个:
drupal_bootstrap()
顾名思义,这主要与“设置舞台”有关,即例如
- 初始化基本配置
- 初始化数据库访问
- 初始化会话处理
- 识别请求用户
- 最终通过提供缓存内容来缩短请求
- ... (更多东西)
这里重要的一点是,已经在这个阶段,钩子系统将调用其他模块,如果他们要求的话,让他们有机会在这个早期阶段注入自定义逻辑。虽然模块这样做并不常见,但它增加了 Drupal 的灵活性,可以满足特殊需求,例如影响用户识别过程、防止或强制缓存命中、重写请求的路径和其他“低级别” ' 操纵。
menu_execute_active_handler()
这与 CodeIgniter 草图中的步骤 1. 和 2. 大致匹配。它将检查请求的路径,将其与正确的回调函数匹配(包括一些“将通配符转换为参数”逻辑),并调用该回调,传递提取的(或预定义的)参数。回调通常期望返回主页内容,但可以自由地做其他事情,例如重定向请求。大多数“业务逻辑”将在此处完成,但请注意,返回的内容通常已经是标记片段,因此此阶段已经包含视图层的某些部分!
theme_page()
(通过函数间接调用theme()
,这增加了很多周围的“魔法”)
这(非常)大致匹配通常的视图层,因为这是要返回的标记的最终组装发生的地方。但它也是页面“周边”元素组合的地方(想想菜单、标题、侧边栏等),因此在这个阶段仍有很大的“业务逻辑”潜力。
在所有这些步骤中,挂钩系统(以及类似设计的主题系统)将提供相当多的“挂钩”点供其他模块“订阅”,如果他们需要的话。当被调用时,他们将获得当时正在处理的相关信息,并可以选择介入并操作它(或者只是触发一些单独的处理)。所有这些加起来是一个非常灵活的系统(因为自定义模块有大量的“拦截和操作”选项),但也造成了学习 Drupal 的许多困难,例如“什么时候发生”的问题通常不容易回答:/
所以简单总结一下:
- bootstrapping - 初始化繁重的工作,最终丰富了“业务逻辑”的早期入侵。
- 执行 - 主要的“业务逻辑”处理,已经有一些“视图”生成逻辑(标记片段的组装)。
- 主题化 - 主要标记生成,“业务逻辑”的一些重要部分仍在混合中。