“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
要理解这一部分推荐先了解RFC2616文档,RFC文档就是互联网技术的魂,该文档定义了http协议,里面详细阐述了各类http头的使用,作为补充材料可以看一看“上野宣”所著的《图解HTTP》一书,于均良翻译,(题外话:日本人写的技术书籍大多比较踏实,印象深刻的是远山启写的《数学与生活》简述极限概念的时候比国内高等教育教科书好太多,希望国内多出好书,)
Drupal使用了symfony框架的http-foundation组件,里面定义了响应对象,文件路径为\vendor\symfony\http-foundation,默认有五个响应对象:
Response:通用响应对象,用于处理一般响应,也是用的最多的响应对象
以下四个用于特殊目的,他们都继承自Response:
BinaryFileResponse:文件响应
JsonResponse:json响应
RedirectResponse:重定向响应
StreamedResponse:流媒体响应
以上四个响应类对基本的Response进行了扩展或修正
这里主要讲述Response:
Response的作用是储存响应页面,及http响应头的管理(这里包括设置cookie),系统的功能就是将请求对象转换为响应对象,响应对象的形成意味着已经为浏览器准备好了响应,只需要调用$response->send();发送即可,在系统执行过程中会检测是否产生了该对象,比如调用控制器后,返回的如果是Response的实例则表示控制器直接产生了输出,否则将返回内容当做渲染数组去开启模板引擎
Symfony\Component\HttpFoundation\Response::create($content = '', $status = 200, $headers = array());可以直接创建一个响应对象,
$content为字符串内容或者具备__toString()方法的对象
$status为状态码
$headers为http响应头部,设置的HTTP头在调用send方法时才会被真正的发送
在Response内部响应页面是直接用一个属性存储的,HTTP响应头使用ResponseHeaderBag对象进行管理,cookie用Cookie对象管理并保存在ResponseHeaderBag的cookies属性数组里面,真正的发送动作在Response对象里面完成
设置一个cookie:
$response->headers->setCookie(new Cookie($name,$value, $expire, $path, $domain, $secure, $httpOnly));
其中$expire可以是表示时间的字符串、时间戳、DateTime对象
Response具备__toString()方法,因此你可以直接echo $response;看一看输出内容和HTTP头
响应对象对缓存头的控制:
$response->setCache(array $options);
参数$options是一个缓存指令数组,键名为缓存指令(默认仅支持这些缓存指令:'etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public'),键值为对应的值。
此外Response提供了大量的常用方法,请参看类定义
得到cookie:
在控制器等地方可以使用以下语句去获取cookie:
\Drupal::request()->cookies->get($key);
在Drupal中,类“\Drupal”是一个获取常用服务的快捷方法,定义在“/web/core/lib/Drupal.php”中
该类将来会频繁用到,后面还会多次提及,待你学习完“服务容器”概念后就会明白其原理
反馈互动