“上下文Context”这个词是什么意思呢?平常生活中它常见于语言、文字交流里面,意思是当前交流处于一个特定的环境下,依托前面的内容交流才有意义
比如这句话:“他正在学习drupal”,如果单独说是没有意义的,因为你不知道“他”指代谁,在交流中前面一定定义清楚了“他”是谁,这个“他”就是上下文,这个谁就是上下文的值
在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境。不过你无需去理会这样晦涩的定义,只需要知道“上下文”相当于“环境”就行了,它们是等价的。
假设将来能制造出真正的类人智能机器人,那么把它投放到社会中,激活那一刻,他第一件事情就是侦查环境,换句话说就是搞清楚自己所在的上下文,然后他才能有所行动
可见上下文概念是如此重要,在脑子里面建立一个印象:有目的的行为是建立在环境之上的,万事万物皆是如此
在drupal中上下文就是指当请求到来时,系统所处的工作环境,这个环境由请求和系统设置共同构成,系统首先要搞清楚环境(上下文)才知道自己该怎么行动(正应前文所讲)。
那么缓存上下文CacheContext呢,就是指相对于缓存系统的环境(缓存环境是系统环境的子集),缓存系统依据此环境才能正确行动,具体实现就是缓存依据这个上下文来存放或取回正确的数据。
在缓存系统中,相对于缓存标签代表缓存有效性而言,缓存上下文代表数据的变体,同一份数据不同环境有不同变体,可以说缓存上下文主要目的就是产生缓存id
缓存上下文决定了缓存id,也就是Cid,它唯一标识一条缓存,用它取回和设置一条缓存,关于缓存系统的介绍请看本系列前面的主题
下面我们来看一看缓存上下文怎么使用,以及系统是如何实现的:
缓存上下文的用法:
缓存上下文的值是一个字符串数组,字符串是特定的,代表一种上下文,这个上下文用一个上下文对象实现,以容器的服务形式存在,加上“cache_context.”前缀就是它对应的容器服务id
这个字符串经常被叫做“token”、上下文id、缓存上下文占位符等
本质上讲它是某一环境参数的标识符,在计算Cid(缓存id)时将通过对应的上下文服务对象得到具体的环境值
一个简单的例子,比如在控制器返回的渲染数组可以这样指定缓存属性:
$build = [
'#markup' => t('Hi, %name, welcome back!', ['%name' => $current_user->getUsername()]),
'#cache' => [
'keys' => [...],
'contexts' => ['user'],
'tags' => [...],
'max-age' => -1
]
];
这里的'user'就是缓存上下文id,可以有多个上下文id,它们组成一个上下文数组,系统默认提供了以下上下文id:
Array
(
[0] => cookies
[1] => headers
[2] => ip
[3] => languages
[4] => request_format
[5] => route
[6] &#