首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Drupal是如何工作的?

Drupal是如何工作的?
EN

Stack Overflow用户
提问于 2009-07-01 11:17:38
回答 8查看 33.2K关注 0票数 153

有人能提供Drupal7控制流的架构概述吗?也许从流程图的意义上讲,页面是如何生成的。关于Drupal是如何工作的,您建议咨询哪些额外的资源?

EN

回答 8

Stack Overflow用户

发布于 2009-07-01 14:58:04

Drupal在这方面可能会令人困惑,部分原因是它有一个相对较深的函数堆栈。尽管它是过程化的PHP,但在其体系结构中它纯粹是事件/侦听器驱动的,并且在PHP主脚本中没有简单的“流”供您查看。我最近做了a presentation on this very subject,幻灯片发布在slideshare上,但快速的高级摘要可能会有用。

  • Drupal的index.php文件用作前端控制器。所有页面都通过它,用户请求的“实际”url/路径作为parameter.
  • Drupal's路径路由器系统(MenuAPI)传递给index.php,用于将请求的路径与给定的插件模块相匹配。该插件模块负责构建页面的“主要内容”。

主题一旦构建了主要页面内容,index.php就会调用

  • (‘page’,$content),将内容交给Drupal的主题/皮肤系统。在那里,它被包装在sidebars/headers/widgets/etc..
  • The中呈现的页面,然后交回给apache,它被发送回用户的浏览器。

在整个过程中,Drupal和第三方插件模块都会触发事件,并侦听它们的响应。Drupal称之为“钩子”系统,它是使用函数命名约定实现的。例如,“博客”模块可以通过实现一个名为blog_user()的函数来拦截与“用户”相关的内容。在Drupal的说法中,这称为hook_user()。

它有点笨拙,但由于PHP的一个怪癖(它保留了所有已加载函数的内部哈希表),它允许Drupal通过迭代已安装插件的列表来快速检查侦听器。对于每个插件,它可以在适当命名的模式上调用function_exists(),并调用该函数(如果存在)。(“我正在触发'login‘事件。'mymodule_login’函数存在吗?我将调用它。'yourmodule_login‘存在吗?不存在?’nextmodule_login‘怎么样?”等)再说一次,有点笨拙,但它工作得很好。

中发生的所有都是因为其中一个事件被触发。MenuAPI只知道不同的插件模块处理哪些urls/路径,因为它会触发“菜单”事件(hook_menu),并收集插件模块响应的所有元数据。(“我将处理url 'news/recent',这是需要构建该页面时要调用的函数...”)之所以保存内容,是因为Drupal的FormAPI负责构建页面,并触发“表单已提交”事件以供模块响应。每小时维护一次是因为触发了hook_cron(),并且任何以mymodulename_cron()作为函数名的模块都将调用其函数。

其他的一切归根结底都是细节--重要的细节,但在这个主题上有一些变化。index.php是控制器,菜单系统确定“当前页面”是什么,并且在构建该页面的过程中会触发许多事件。插件模块可以与这些事件挂钩,并改变工作流程/提供额外的信息等。这也是为什么如此多的Drupal资源专注于制作模块的部分原因。如果没有模块,Drupal实际上不会做任何事情,只会说:“有人要了一个页面!它存在吗?不存在吗?好吧,我会提供一个404。”

票数 164
EN

Stack Overflow用户

发布于 2013-01-21 15:38:54

要理解Drupal是如何工作的,您需要理解Drupal的页面服务机制。

简而言之,所有的调用/url/请求都是由index.php提供服务的,它通过包含各种包含文件/模块,然后调用模块中定义的适当函数来服务请求/url,从而加载Drupal。

这是从书中摘录的,Pro Drupal Development,它解释了Drupal的引导过程,

引导程序进程

Drupal通过经历一系列引导阶段对每个请求进行引导。这些阶段在bootstrap.inc中定义,并按照以下各节中所述进行。

初始化配置

此阶段填充Drupal的内部配置数组,并建立站点的基URL ($base_url)。通过include_once()解析settings.php文件,并应用在其中建立的任何变量或字符串覆盖。有关详细信息,请参阅文件sites/all/default/default.settings.php的“Variable Overrides”和“String Overrides”部分。

早期页面缓存

在需要高级别可伸缩性的情况下,可能需要在尝试数据库连接之前调用缓存系统。早期页面缓存阶段允许您包含(通过include())一个包含名为page_cache_ fastpath()的函数的phase,该函数接管并将内容返回给浏览器。通过将page_cache_fastpath变量设置为TRUE来启用早期页面缓存,通过将cache_inc变量设置为文件路径来定义要包含的文件。有关示例,请参阅有关缓存的章节。

初始化数据库

在数据库阶段,确定数据库的类型,并建立将用于数据库查询的初始连接。

基于主机名/IP的访问控制

Drupal允许在每个主机名/IP地址的基础上禁止主机。在访问控制阶段,会进行快速检查以查看请求是否来自被禁止的主机;如果是,则拒绝访问。

初始化会话处理

Drupal利用了PHP的内置会话处理,但用自己的处理程序覆盖了一些处理程序,以实现数据库支持的会话处理。在会话阶段初始化或重新建立会话。表示当前用户的全局$user对象也在这里初始化,尽管为了提高效率,并非所有属性都可用(它们是在需要时通过显式调用user_load()函数来添加的)。

延迟页面缓存

在后期页面缓存阶段,Drupal加载足够的支持代码来确定是否从页面缓存中提供页面。这包括将数据库中的设置合并到初始化配置阶段创建的数组中,以及加载或解析模块代码。如果会话指示请求是由匿名用户发出的,并且启用了页缓存,则从缓存中返回该页并停止执行。

语言确定

在语言确定阶段,初始化Drupal的多语言支持,并根据站点和用户设置决定使用哪种语言为当前页面提供服务。Drupal支持几种确定语言支持的替代方案,例如路径前缀和域级语言协商。

路径

在路径阶段,加载处理路径和路径别名的代码。此阶段支持解析人类可读的URL,并处理内部Drupal路径缓存和查找。

Full

此阶段通过加载通用函数库、主题支持以及对回调映射、文件处理、Unicode、PHP图像工具包、表单创建和处理、邮件处理、可自动排序表和结果集分页的支持来完成引导过程。设置了Drupal的自定义错误处理程序,并加载了所有已启用的模块。最后,Drupal触发init钩子,这样模块就有机会在正式处理请求之前得到通知。

一旦Drupal完成引导,框架的所有组件都可用。是时候接受浏览器的请求并将其传递给将处理它的PHP函数了。URL和处理它们的函数之间的映射是使用同时负责URL映射和访问控制的回调注册表完成的。模块使用菜单钩子注册它们的回调(更多细节见第4章)。

当Drupal确定存在浏览器请求的URL成功映射到的回调,并且用户有权访问该回调时,控制权交给回调函数。

处理请求的

回调函数执行处理和累积满足请求所需的数据所需的任何工作。例如,如果接收到对诸如节点q= http://example.com/ /3之类的内容的请求,则将该node_page_view映射到node.module中的函数node_page_view()。进一步的处理将从数据库中检索该节点的数据,并将其放入数据结构中。然后,就到了主题的时候了。

为Data设置主题

主题化涉及将已检索、操作或创建的数据转换为HTML (或XML或其他输出格式)。Drupal将使用管理员选择的主题来赋予web页面正确的外观。然后将生成的输出发送到web浏览器(或其他HTTP客户端)。

票数 63
EN

Stack Overflow用户

发布于 2009-07-01 17:18:31

Eaton的回答提供了一个很好的概述。(我是新来的,所以我不能模仿他,所以有这样的评论。)

对我来说,残酷的“顿悟”时刻是意识到一切都是通过index.php发生的,然后是通过模块的瀑布(首先是核心,然后是站点)。要扩展核心功能,不要重写它。相反,将模块复制到/sites/all/modules/或/sites/yoursite/modules中并对其进行扩展,或者在这些位置创建一个新模块。主题也是如此。模块目录也可以包含tpl、css等形式的显示代码。

如果你习惯了更严格的MVC类型的框架,比如Rails,Django等等,所有这些都会让你有点困惑。模块可能混合了很多显示代码,如果您正在查看其他人的模块或模板,您最终会在堆栈中向后遍历。这就是在PHP中工作的好处和痛苦。

具有讽刺意味的是,“只要构建一个应用程序”可能是最糟糕的学习方法。Drupal做了这么多开箱即用的功能,在您弄清楚控制流之前,这些功能是很难理解的。例如,tpl文件中没有任何内容可以告诉您具有有趣名称(如l() )的函数来自何处。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1068556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档