Drupal的Bootstrap / Dispatch / Routing Flow

时间:2011-02-15 16:19:02

标签: drupal drupal-navigation

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

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();

我试图从高层次了解Drupal的核心系统如何工作,特别是与基于Web的MVC的关系。所以在Code Igniter like系统中,如下

  1. 检查网址,将其转换为课程和操作

  2. 在类上调用action方法,从模型加载信息,“businessy logic”完成

  3. 将信息传递给视图层

  4. 布局系统呈现HTML页面

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

  6. Drupal中的等效调度过程是什么?我理解模块系统是如何工作的,但是我并不完全遵循Drupal关于数据加载和主题/布局渲染的方式/原因的理念,以及两者之间的切换发生的地方。

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

3 个答案:

答案 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();

一个接一个:

  1. drupal_bootstrap()
    顾名思义,这主要涉及“设定阶段”,即例如。

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

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

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

  3. theme_page()(通过theme()功能间接调用,增加了很多周围的'魔法') 这(非常)大致匹配通常的视图层,因为这是要返回的标记的最终组装。但它也是页面的“周围”元素组合的地方(想想菜单,标题,侧边栏等),因此在这个阶段仍然存在很多“商业逻辑”的可能性。 / p>

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

    所以很快总结一下:

    1. bootstrapping - 初始化笨拙的工作,最终充满了对“业务逻辑”的早期入侵。
    2. 执行 - 主要的“业务逻辑”处理,已经有一些“视图”生成逻辑(标记片段的汇编)。
    3. 主题 - 主要标记生成,“业务逻辑”的一些重要部分仍处于混合状态。

答案 1 :(得分:3)

答案 2 :(得分:3)

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

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

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

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