Response使用
自从使用TP5后,Response和Request就随处可见了,那么在知道Request是请求相关业务的封装类后,Response是什么呢?
通过名字我们也可以看出来,Response是输出的封装类。比如Trace调试的实现、响应码设置、响应头部设置等等。
Response的几种类型
基于不同的type封装响应逻辑实现定制化向客户端输出。
/**
* 创建Response对象
* @access public
* @param mixed $data 输出数据
* @param string $type 输出类型
* @param int $code
* @param array $header
* @param array $options 输出参数
* @return Response|JsonResponse|ViewResponse|XmlResponse|RedirectResponse|JsonpResponse
*/
public static function create($data = '', $type = '', $code = 200, array $header = [], $options = [])
{
//Response有Json、Jsonp、Redirect、View、Xml5个不同功能的子类
//可自定义Response类 一般type参数默认都为json或html
//type ==> redirect 将实例化think\response\Redirect对象
//type ==> json 将实例化think\response\Json对象
//type ==> jsonp 将实例化think\response\Jsonp对象
//观察下发现,区别在与 响应header设置的不同,输出数据封装不同
//对比下 output方法
$class = false !== strpos($type, '\\') ? $type : '\\think\\response\\' . ucfirst(strtolower($type));
//所以一般都是new static
if (class_exists($class)) {
$response = new $class($data, $code, $header, $options);
} else {
$response = new static($data, $code, $header, $options);
}
return $response;
}
通过调用静态static方法来实例化对象,其实直接new也能实例Response,但是这样操作无法选择不同的类型。
正常情况下,使用较多的有四种
Response::create();
控制器业务执行完成后,若不需输出body响应数据,按照以前的做法可能就是执行exit结束了。但是如此这么做,会导致没有执行到Response的send方法,至于sen