3. 响应对象及Cookie设置
要理解这一部分推荐先了解RFC2616文档,RFC文档就是互联网技术的魂,该文档定义了http协议,里面详细阐述了各类http头的使用,作为补充材料可以看一看上野宣所著的《图解HTTP》一书(封面见辅助内容区),于均良翻译,(题外话:日本人写的技术书籍大多比较踏实,印象深刻的是远山启写的《数学与生活》简述极限概念的时候比国内高等教育教科书好太多,希望国内多出好书,)
Drupal8使用了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提供了大量的常用方法,请参看类定义