上海戴文 - Drupal开发 在线教育

你在这里

如何学习Drupal

Drupal学习经验分享。可以以不同角色分享,比如你是做后端开发的,你是如何学习的?

云客Drupal8源码分析之渲染缓存RenderCache

渲染数组被渲染的时候,为了提高性能,会将渲染结果保存到缓存中,这样就避免了重复渲染
并且每个子元素的渲染结果都可以被独立缓存,如此一来子元素也可以避免重复渲染

不过缓存中保存的渲染数组是经过简化的,渲染缓存默认只缓存以下内容,这样经简化的数组叫做“CacheableRenderArray”:

 

云客Drupal8源码分析之渲染占位符及其产生器

渲染占位符及渲染占位符产生器

drupal使用渲染占位符机制的目的是为了提高系统性能,具体来讲就是提高缓存利用率和效率

云客Drupal8源码分析之钩子、模块处理器、函数定义

元旦刚刚过去,继续保持一周一篇的速度,这是Drupal8云客源码分析系列在2017年的开篇,来讲几个极其重要的内容,它们是钩子、模块处理器、函数定义。
钩子:
如果是开发新手可能对这个慨念陌生而好奇,许多工作多年的工程师可能对它也缺乏深度理解,不止是在php中,它其实是软件工程中的重要慨念,什么意思呢?为什么要叫做钩子?既然叫做钩子直觉的就会联想到钩什么?怎么钩?简单而直接的回答就是在软件运行的某时刻去钩起一段代码来执行,这个“钩起”也可以称为调用、获取等,但总不能叫做“调子”“获子”吧,所以形象起见叫做钩子,可以将钩子理解为一种软件实现机制,函数调用就是钩子最简单的情况,执行函数时调用它就是钩起它,函数就是钩子实现,函数名就是钩子名,怎么钩就是通过函数名来钩。

云客Drupal8源码分析之缓存上下文CacheContext

“上下文Context”这个词是什么意思呢?平常生活中它常见于语言、文字交流里面,意思是当前交流处于一个特定的环境下,依托前面的内容交流才有意义

比如这句话:“他正在学习drupal”,如果单独说是没有意义的,因为你不知道“他”指代谁,在交流中前面一定定义清楚了“他”是谁,这个“他”就是上下文,这个谁就是上下文的值

在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境。不过你无需去理会这样晦涩的定义,只需要知道“上下文”相当于“环境”就行了,它们是等价的。

假设将来能制造出真正的类人智能机器人,那么把它投放到社会中,激活那一刻,他第一件事情就是侦查环境,换句话说就是搞清楚自己所在的上下文,然后他才能有所行动

可见上下文概念是如此重要,在脑子里面建立一个印象:有目的的行为是建立在环境之上的,万事万物皆是如此

 

云客Drupal8源码分析之渲染上下文RenderContext、渲染器renderer

当drupal的控制器返回渲染数组的时候,系统会派发视图事件,渲染数组被main_content_view_subscriber(主内容视图订阅器)处理,它根据请求的格式,将系统流程定向到对应的格式渲染器,系统默认提供了四个格式渲染器,他们被定义在容器的main_content_renderers参数里面,其中html格式对应的是服务id为“main_content_renderer.html”的html格式渲染器,我们得到的html格式页面几乎都是它渲染的,它将渲染分为两个步骤:先渲染body标签,然后渲染html标签,其中我们将html的渲染称为根渲染。

具体的工作是由渲染器完成的,它负责将渲染数组转换为html字符串,本篇的主题就是这个渲染器。

要理解它是怎么工作的需要先理解一些知识。

首先是渲染数组,关于它可阅读本系列的《云客Drupal8源码分析之渲染数组(render array)》

其次是渲染上下文,下面介绍一下渲染上下文:

云客Drupal8源码分析之渲染数组(render array)

从本质上讲现代所有的web软件系统中都用到了渲染数组,只不过在drupal世界里明确给了它这个名字:“渲染数组”。

如果你使用过模板引擎,那么会很熟悉它,要使模板引擎工作,那么需要给它传入一些变量,这些变量将决定模板里面对应变量的显示,传入的这些变量往往是以数组的方式传入,键名代表模板里面的变量名,键值代表变量值,这样的数组就叫做渲染数组,比如著名的php小型框架CodeIgniter(简称CI框架)中的经典用法就是这样:

 

$this->load->view('show_news', $data);

其中参数show_news指定网页模板,参数$data就是程序中准备好的一个数组,包含了传递给模板的变量

 

云客Drupal8源码分析之页面标题

本篇主题讲解drupal8系统是如何计算页面标题的,标题很重要,尤其对于搜索引擎优化来说,标题权重很高

页面有标题当然是针对请求格式为html而言,在整个执行流程中如果控制器直接返回响应对象,那么标题计算就在控制器中随意进行
流程仅仅停留在Symfony的渲染管道中,如果控制器返回的是渲染数组,那么将派发视图事件,主内容视图订阅器MainContentViewSubscriber将判断请求格式,并启动对应的格式渲染器渲染输出
今天的话题就发生在请求格式为html的HtmlRenderer渲染器中,这个渲染器用到了标题解析器
这就是本主题的内容,下面看看标题是怎么计算出来的:

云客Drupal8源码分析之控制器执行及其解析器controller_resolver

在drupal的HttpKernel核心中使用控制器解析器来取得要执行的控制器,以及解析出控制器需要的参数
除此之外也在多个地方用到它,比如渲染数组的回调解析,是一个重点内容

它的服务ID为:controller_resolver,接受以下两个参数:

psr7.http_message_factory:用于创建psr7描述的请求对象(关于这个请看:http://www.php-fig.org/psr/psr-7/
class_resolver:从容器里面取服务

云客Drupal8源码分析之网站维护模式

当drupal8的网站需要升级、导入内容、备份、更改内容类型等等会影响访问用户的时候需要开启维护模式,操作路径是:管理-配置-开发-维护模式
开启维护模式并输入提示内容即可,在提示内容中@site可以代表当前站点的名称,除此外没有其他变量
那么维护模式是怎么实现的呢?这就是本篇的主题:

判断维护模式的工作是在处理核心派发kernel.request事件的时候进行的,优先级低于路由判断,也就是说此时已经知道请求所对应的路由线路是什么,系统已经解析出了请求对应的路由对象(也可以理解成路由线路)。

云客Drupal8源码分析之路由系统Route

drupal8使用的路由系统很强大,在系统中是一个比较大的子系统,它基于Symfony路由组件,所以请务必先学习Symfony的路由组件。

Symfony路由组件的官网文档地址是:http://symfony.com/components/Routing

路由是什么呢?就是一个请求到达后决定由谁去处理的系统,它决定着处理流程的去向,一些比较小的系统路由设计会针对网址特定的格式或元素判断谁来处理,比如常见的MVC,著名的CI框架就在网址中包含控制器、视图、模型信息来判断流程去向,然而drupal8使用的路由系统非常强大,远不止于此,它不但对url没有特征要求,还可以针对请求方法、浏览器代理标识符、上传内容类型、网址部分的正则格式等等来控制,这样能使用任意有表达力的字符串,与系统内部特征解耦,是一个全功能的路由系统。

页面

订阅 RSS - 如何学习Drupal