跳转到主要内容

和“
Drupal8
”有关的内容:

在drupal控制器中返回的渲染数组及子渲染数组(注:不同于子元素,以“子渲染数组”这个名词表示非#开始的数组子元素)可以选择性的指定元素类型,也就是渲染数组的$elements['#type']值,这里讲的元素类型,不同于html的元素类型,后者往往表示html标签,…

非数字索引的处理体现了和array_merge_recursive函数的区别:
drupal实现是:相同键名间他们的值都为数组,则进行递归合并,否则只要有一个不是数组,将用后面的值覆盖前面的值。
如:(见辅助内容区)…

drupal实现的合并

drupal中实现了一种特殊的合并,和以上所有合并都不一样,代码位于
Drupal\Component\Utility\NestedArray::mergeDeep($arr1, $arr2, ...);
Drupal\Component\…

array_merge_recursive 递归合并

此函数是一种全保留的合并,将所有数组的值都保留下来,特征是不覆盖,将本会覆盖的值合并组成新数组,数字索引将重新索引,这个过程是递归的,如:(代码见辅助内容区)…

通过“+”操作符号进行数组相加

直接将两个数组通过“+”操作符相加,是一种前保留合并,就是说如果键名相同,包括数字索引键名,则前面的覆盖后面的,以前值为准,使用时需特别注意数字索引问题,它的特征是完全保留前面的数组

此函数官方文档请见:http://php.net/manual/zh…

在drupal8的源码实现中有非常多的合并数组操作,这本是php层面的知识,但鉴于用的如此之多,而且drupal还专门实现了一种合并方法,所以特别设置一个主题来讲解。

合并php数组主要有以下几个方法:

1:通过“+”操作符号进行数组相加的前保留合并

2:函数:array_merge 后保留合并

占位渲染缓存:

在drupal实际的使用中,渲染缓存采用的是占位渲染缓存PlaceholderingRenderCache它扩充了RenderCache的功能
我们知道渲染占位符的目的就是将系统不适合缓存的内容独立出来,单独渲染,结果并不会缓存

思考:

能否将渲染后的结果直接保存在渲染前Cid下呢?为什么?
如果这样做,那么在系统其它地方要对这份缓存进行操作时,那么就需要知道它渲染前的Cid,这可能是个问题
缓存API的一般原则是:被缓存的数据对象自带缓存属性数据,可以从渲染后的渲染数组自身计算出对应的缓存id…

我们可以使用$elements['#cache']['bin']自定义渲染结果数组的缓存位置,也可以不指定
不指定相当于:$elements['#cache']['bin']='render',所以缓存默认被保存到数据库的'render'缓存表里

要进行缓存有两个必要条件,同时满足就是充分条件:
$…

注意:它并不包括$elements['#cache']['keys']
默认如上,但是当我们也想缓存其他内容的时候怎么处理?可以这样:
指定$elements['#cache_properties'],它是一个数组,键值为想要缓存的元素的键名即可
比如在Drupal\Core\Render\MainContent\…