有人可以提供Drupal 7控制流的架构概述吗?也许是关于如何生成页面的流程图。关于Drupal如何工作,您建议咨询哪些额外资源?
答案 0 :(得分:156)
Drupal在这方面可能令人困惑,部分原因是因为它有一个相对较深的函数堆栈。虽然它是程序化的PHP,但它在其体系结构中是纯粹的事件/监听器驱动,并且主PHP脚本中没有简单的“流程”供您查看。我最近做了a presentation on this very subject,幻灯片发布在slidehare上,但快速的高级摘要可能会有用。
在整个过程中,Drupal和第三方插件模块正在触发事件,并听取它们的响应。 Drupal称之为'hook'系统,它是使用函数命名约定实现的。例如,“博客”模块可以通过实现名为blog_user()的函数来拦截“用户”。在Drupal的说法中,这叫做 hook_user()。
它有点笨拙,但是由于PHP的怪癖(它保留了所有加载函数的内部哈希表),它允许Drupal通过迭代已安装的插件列表来快速检查侦听器。对于每个插件,它可以在适当命名的模式上调用function_exists(),并在函数存在时调用该函数。 (“我正在触发'登录'事件。'mymodule_login'函数是否存在?我会调用它。你的'mymodule_login'存在吗?不行吗?'nextmodule_login'怎么样?”等等)再次,触摸笨重但是它效果很好。
Drupal中发生的一切因为其中一个事件被触发而发生。 MenuAPI只知道不同插件模块处理的urls /路径,因为它触发'menu'事件(hook_menu)并收集所有元数据插件模块响应。 (“我将处理网址'新闻/最近',这里是需要构建该页面时调用的函数...”)内容只会被保存,因为Drupal的FormAPI负责构建页面,并触发“表单已提交”事件,模块可以响应。每小时维护是因为hook_cron()被触发,并且任何带有mymodulename_cron()作为函数名的模块都将调用其函数。
其他一切最终只是细节 - 重要细节,但主题的变化。 index.php是控制器,菜单系统确定“当前页面”是什么,并且在构建该页面的过程中会触发大量事件。插件模块可以挂钩这些事件并更改工作流程/提供附加信息等。这也是众多Drupal资源专注于制作模块的部分原因。没有模块,Drupal实际上除了说“有人要求页面”之外什么都不做!它存在吗?没有?好的,我会提供404.'
答案 1 :(得分:58)
要了解Drupal的工作原理,您需要了解Drupal的页面服务机制。
简而言之,所有的调用/ url /请求都由index.php提供,它通过包含各种包含文件/模块来加载Drupal,然后调用模块中定义的相应函数来提供请求/ url。
以下是本书Dr Proupal Development的摘录,该书解释了Drupal的bootstrap过程,
引导过程
Drupal通过一系列的bootstrap阶段在每个请求中自行引导。这些阶段在bootstrap.inc中定义,并按照以下各节中的说明进行操作。
初始化配置
此阶段填充Drupal的内部配置数组并建立基本URL ($ base_url)该网站。 settings.php文件通过include_once()进行解析,并应用已建立的任何变量或字符串覆盖。有关详细信息,请参阅文件sites / all / default / default.settings.php的“Variable Overrides”和“String Overrides”部分。
早期页面缓存
在需要高级别可伸缩性的情况下,可能需要使用缓存系统 甚至在尝试数据库连接之前调用。早期页面缓存阶段允许 你包含(带include())一个包含一个名为page_cache_的函数的PHP文件 fastpath(),它接管内容并将内容返回给浏览器。早期页面缓存 通过将page_cache_fastpath变量设置为TRUE以及要包含的文件来启用 通过将cache_inc变量设置为文件的路径来定义。请参阅有关缓存的章节 举个例子。
初始化数据库
在数据库阶段,确定数据库的类型,并建立初始连接 制作将用于数据库查询。
主机名/基于IP的访问控制
Drupal允许基于每个主机名/ IP地址禁止主机。在访问控制中 阶段,快速检查请求是否来自被禁止的主机;如果是这样, 访问被拒绝。
初始化会话处理
Drupal利用了PHP的内置会话处理功能,但覆盖了一些处理程序 用它来实现数据库支持的会话处理。会话已初始化 或在会议阶段重新建立。表示当前用户的全局$ user对象 也在这里初始化,但为了提高效率,并非所有属性都可用(在需要时通过显式调用user_load()函数添加它们。)
延迟页面缓存
在页面缓存阶段,Drupal会加载足够的支持代码以确定是否为 不从页面缓存中提供页面。这包括将数据库中的设置合并到初始化配置阶段创建的数组中,以及加载或解析模块代码。如果会话指示请求是由匿名用户发出的并且启用了页面缓存,则从缓存返回页面并停止执行。
语言决定
在语言确定阶段,Drupal的多语言支持已初始化,并根据站点和用户设置决定使用哪种语言为当前页面提供服务。 Drupal支持多种用于确定语言支持的备选方案,例如路径前缀和域级语言协商。
<强>路径强>
在路径阶段,加载处理路径和路径别名的代码。此阶段启用 要解析的人类可读URL并处理内部Drupal路径缓存和 查找。
展开强>
此阶段通过加载常用函数库(主题)来完成引导过程 支持,并支持回调映射,文件处理,Unicode,PHP图像工具包,表单 创建和处理,邮件处理,自动排序表和结果集分页。设置Drupal的自定义错误处理程序,并加载所有已启用的模块。最后,Drupal触发init挂钩,以便模块有机会在正式处理请求之前得到通知。
Drupal完成引导后,框架的所有组件都可用。 现在是时候接受浏览器的请求并将其交给PHP函数了 处理它。 URL和处理它们的函数之间的映射是使用完成的 一个回调注册表,负责URL映射和访问控制。模块注册 使用菜单钩子进行回调(有关详细信息,请参阅第4章)。
当Drupal确定存在一个回调浏览器的URL时 请求成功映射并且用户有权访问该回调,控制权将被传递给回调函数。
处理请求
回调函数执行处理和累积完成请求所需的数据所需的任何工作。例如,如果请求内容,例如http://example.com/ q =收到node / 3,URL被映射到node.module中的函数node_page_view()。 进一步处理将从数据库中检索该节点的数据并将其放入数据结构中。那么,现在是时候了。
主题数据
主题涉及转换已检索,操作或创建的数据 到HTML(或XML或其他输出格式)。 Drupal将使用管理员的主题 已经选择为网页提供正确的外观和感觉。然后,生成的输出将发送到Web浏览器(或其他HTTP客户端)。
答案 2 :(得分:20)
伊顿的回答提供了一个很好的概述。 (我是新来的,所以我不能修改他,因此评论。)
对我来说,残酷的“啊哈”时刻是通过index.php实现一切,然后通过模块的瀑布(核心先,然后是网站)。要扩展核心功能,请不要重写它。而是将模块复制到/ sites / all / modules /或/ sites / [yoursite] / modules并扩展THAT,或在这些位置创建新模块。主题相同。模块目录也可以包含显示代码,形式为tpl,css等。
如果您习惯于更严格的MVC类型框架,如Rails,Django等,这一切都会让人感到困惑。模块可以混合使用大量的显示代码,如果您正在查看其他人的模块或模板,您最终会在堆栈中向后移动。这就是使用PHP工作的美妙/痛苦。
具有讽刺意味的是,“只是构建一个应用程序”可能是学习这个的最糟糕方式。 Drupal开箱即用,在您找出控制流程之前,它简直模糊不清。例如,tpl文件中没有任何内容可以告诉您具有有趣名称的函数(如l()的来源)。
答案 3 :(得分:9)
阅读手册,尤其是主题开发人员指南。 Drupal支持几个主题引擎。 Zen使用phptemplate,所以要注意指南的那一部分。
对于模块开发,API在api.drupal.org上有记录。
特别是当您需要快速,快速地获取信息时 http://www-128.ibm.com/developerworks/ibm/osource/implement.html
答案 4 :(得分:7)
这取决于你正在寻找的理解程度;如果你对php有很好的了解,我建议你阅读代码本身,从index.php开始,然后转到includes / bootstrap.inc,然后是该目录中的一些其他脚本。
密钥包含文件:
模块/目录中还有一些关键功能;特别是,modules / node / node.module构成了节点系统的基础,通常用于封装网站内容。
一般来说,代码非常好评和清晰。在注释中使用Doxygen标记意味着代码有效地是规范文档。
使用可以快速跳转到函数定义的编辑器也可以做到这一点。将vim与ctags结合使用对我有用;你必须告诉ctags索引.inc,.module等文件作为php文件。
答案 5 :(得分:5)
我通过将drupal .php代码导入NetBeans项目来学习负载。 然后,您可以运行netbeans调试器并观察页面的不同阶段。
答案 6 :(得分:5)
This(适用于Drupal 6)&amp; this(对于Drupal 7)是一个非常好的drupal架构概述。如果你想要更多的细节,那么我会开始写一些大多数的文档是好的。尝试以高水平的细节来学习它而没有具体的东西可以更难以尝试。
答案 7 :(得分:5)
关于这个主题的最好的书籍是“Pro Drupal Development”和“Using Drupal。”
“Dr Drupal Development”包括几个漂亮的流程图和每个Drupal的API(表单,主题等)的详尽摘要。它对于制作自己的模块和主题的人来说特别有启发性,但对于想要了解Drupal的普通PHP开发人员来说有很多价值。除此之外,我已经为我构建的每个站点创建了一个自定义模块,只是为了获得对各种形式的选择性隐藏字段等内容的额外控制(为了简化结尾的节点形式,您通常希望这样做 - 用户),所以最好把这些知识放在你的帽子下面。
“使用Drupal”是针对想要了解如何构建画廊,博客和社交网站等优秀内容的网站开发人员。它经历了几个用例,并展示了如何配置现有模块来完成每项工作。在此过程中,它使您熟悉必要的附加模块“内容构建工具包”(CCK)和“视图”,如何制作自定义块和模板,以及维护Drupal站点的细节。我推荐这本书特别适合那些想要加快速度并立即使用Drupal的人。在此过程中,您将了解Drupal的内部组织。
答案 8 :(得分:4)
这里的新撰稿人,对话迟了2年; - )
回复https://stackoverflow.com/a/1070325/1154755
扩展核心功能不要重写它。而是复制模块 进入/ sites / all / modules /或/ sites / [yoursite] / modules并扩展 那,或在那些地方创建一个新模块。主题相同。
实际上,我从来没有必要复制核心模块来更新它。 Drupal Hooks应该就是你所需要的。
对于主题,是的,有时它是唯一的方法,但通常,你可以建立一个子主题来获得你需要的结果。