Drupal的Bootstrap/Dispatch/Routing Flow

Ala*_*orm 6 drupal drupal-navigation

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

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();
Run Code Online (Sandbox Code Playgroud)

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

  1. 检查URL,将其转换为类和操作

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

  3. 信息被移交给视图层

  4. 布局系统呈现HTML页面

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

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

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

Hen*_*pel 14

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

关于到MVC Drupals关系,我参加了一个刺在主题与这个问题的答案为"A为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();
Run Code Online (Sandbox Code Playgroud)

逐一:

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

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

    这里的一个重点是,在这个阶段,钩子系统将调用其他模块,如果他们要求它,让他们有机会在这个早期阶段注入自定义逻辑.虽然它不是常见的模块,以做到这一点,把它添加到的Drupal的灵活性,它可以为特殊需要像例如影响用户识别过程中,防止或强制执行缓存命中,改写请求的路径和其他"低级别完成'操纵.

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

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

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

所以很快总结一下:

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