假设最小模块安装(为了简单起见),Drupal index.php
中两个顶级函数的核心“职责”是什么?
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();
我试图从高层次了解Drupal的核心系统如何工作,特别是与基于Web的MVC的关系。所以在Code Igniter like系统中,如下
检查网址,将其转换为课程和操作
在类上调用action方法,从模型加载信息,“businessy logic”完成
将信息传递给视图层
布局系统呈现HTML页面
部分布局(通常是“内容区域”)由第3步中传递的信息驱动
Drupal中的等效调度过程是什么?我理解模块系统是如何工作的,但是我并不完全遵循Drupal关于数据加载和主题/布局渲染的方式/原因的理念,以及两者之间的切换发生的地方。
我意识到Drupal与Web应用程序MVC系统截然不同;我试图了解如何。我意识到Drupal是在不完全理解这一点的情况下成功使用的。优先考虑Drupal 7的答案,但是如果有根本性的变化,欢迎来自以前版本的信息。
答案 0 :(得分:14)
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()
顾名思义,这主要涉及“设定阶段”,即例如。
这里的一个重点是,在此阶段,钩子系统将调用其他模块,如果他们要求它,让他们有机会在这个早期阶段注入自定义逻辑。虽然模块执行此操作并不常见,但它增加了Drupal的灵活性,可以满足特殊需求,例如:影响用户识别过程,阻止或强制执行缓存命中,重写请求的路径以及其他“低级别”操作。
menu_execute_active_handler()
这大致与CodeIgniter草图中的步骤1和2相匹配。它将检查请求的路径,将其与正确的回调函数(包括一些'将通配符转换为参数'逻辑)匹配,并调用该回调,传递提取的(或预定义的)参数。回调通常会返回主页面内容,但可以自由地执行其他操作,例如只是重定向请求。大多数“商业逻辑”都将在这里完成,但请注意返回的内容通常已经是标记片段,所以此阶段已包含视图层的某些部分!
theme_page()
(通过theme()
功能间接调用,增加了很多周围的'魔法')
这(非常)大致匹配通常的视图层,因为这是要返回的标记的最终组装。但它也是页面的“周围”元素组合的地方(想想菜单,标题,侧边栏等),因此在这个阶段仍然存在很多“商业逻辑”的可能性。 / p>
在所有这些步骤中,钩子系统(以及类似设计的主题系统)将为其他模块“订阅”提供相当多的“挂钩”点,如果需要的话。调用时,它们将传递当时正在处理的相关信息,并可选择介入并操作它(或者只是触发一些单独的处理)。所有这些加起来就是一个非常灵活的系统(因为自定义模块有大量的“拦截和操作”选项),但也是学习Drupal的很多困难,因为“当发生什么时会发生什么”的问题往往不容易回答:/
所以很快总结一下:
答案 1 :(得分:3)
答案 2 :(得分:3)
在引导程序之后,唯一给出的事情是菜单路由器系统,它会确定哪个页面回调负责此请求。为此,它依赖于所有已安装模块在其hook_menu()定义中返回的信息(这存储在数据库中,并且仅在明确请求时才更新,例如,当启用新模块时)。< / p>
该钩子可以控制很多。例如访问权限,定义参数,菜单链接的标题等。此外,菜单路由器几乎可以像您想要的那样复杂,它们不限于通常的控制器/动作模式。我认为您可以定义最多9个元素的菜单路由器项目,例如'yourmodule / view /%/ sub /%/%/ whatever'。
有关示例的简短概述,请参阅http://drupal.org/node/109131。
在该页面回调中,提供模块可以随意执行任何操作。 可以使用主题系统,如果它想要,触发钩子或对页面的“内容”部分做任何其他事情。主题系统将包括主题页面的所有其他部分,包括其他区域和自动包含在这些区域中的其他块。在创建响应AJAX请求或提供xml提要等内容的回调时,这一点很重要。在这些情况下,您需要采取进一步措施对主题进行调整以适应不应包含“休息”的请求。页面。