响应输出
为了规范和清晰起见,最佳的方式是在控制器最后明确输出类型(毕竟一个确定的请求是有明确的响应输出类型),默认支持的输出类型包括:
输出类型 | 快捷方法 | 对应Response类 |
---|---|---|
HTML输出 | response | \think\Response |
渲染模板输出 | view | \think\response\View |
JSON输出 | json | \think\response\Json |
JSONP输出 | jsonp | \think\response\Jsonp |
XML输出 | xml | \think\response\Xml |
页面重定向 | redirect | \think\response\Redirect |
附件下载(V5.1.21+ ) | download | \think\response\Download |
每一种输出类型其实对应了一个不同的Response
子类(response()
函数对应的是Response
基类),也可以在应用中自定义Response
子类满足特殊需求的输出。
响应参数
一、设置数据
Response
基类提供了data
方法用于设置响应数据。
response()->data($data);
json()->data($data);
二、设置状态码
Response
基类提供了code
方法用于设置响应数据,但大部分情况一般我们是直接在调用助手函数的时候直接传入状态码,例如:
json($data,201);
view($data,401);
json($data)->code(201);
三、设置头信息
可以使用Response
类的header
设置响应的头信息
// 单个设置
header('Cache-control', 'no-cache,must-revalidate');
// 批量设置
header([
'Cache-control' => 'no-cache,must-revalidate',
'Last-Modified' => gmdate('D, d M Y H:i:s') . ' GMT',
]);
四、设置额外参数
有些时候,响应输出需要设置一些额外的参数,
json($data)
->options(['json_encode_param' => JSON_NUMERIC_CHECK | JSON_UNESCAPED_UNICODE]);
jsonp($data)
->options([
'var_jsonp_handler' => 'callback',
'default_jsonp_handler' => 'jsonpReturn',
'json_encode_param' => JSON_PRETTY_PRINT,
]);
五、关闭当前的请求缓存(V5.1.5+
)
V5.1.5+
版本开始,支持使用allowCache
方法动态控制是否需要使用请求缓存。
// 关闭当前页面的请求缓存
json($data)->code(201)->allowCache(false);
自定义
function ajaxReturn($data, $type = '')
{
if (empty($type)) $type = 'JSON';
switch (strtoupper($type)) {
case 'JSON' :
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
exit(json_encode($data));
case 'XML' :
// 返回xml格式数据
header('Content-Type:text/xml; charset=utf-8');
exit(xml_encode($data));
case 'JSONP':
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
$handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER');
exit($handler . '(' . json_encode($data) . ');');
case 'EVAL' :
// 返回可执行的js脚本
header('Content-Type:text/html; charset=utf-8');
exit($data);
}
}
文件下载
public function download()
{
$download = new \think\response\Download('image.jpg');
return $download->name('my.jpg');
// 或者使用助手函数完成相同的功能
// download是系统封装的一个助手函数
return download('image.jpg', 'my.jpg');
}
下载文件名可以省略后缀,会自动判断(后面的代码都以助手函数为例)
public function download()
{
// 和上面的下载文件名是一样的效果
return download('image.jpg', 'my');
}
如果需要设置文件下载的有效期,可以使用
public function download()
{
// 设置300秒有效期
return download('image.jpg', 'my')->expire(300);
}
除了expire
方法外,还支持下面的方法:
方法 | 描述 |
---|---|
name | 命名下载文件 |
expire | 下载有效期 |
isContent | 是否为内容下载 |
mimeType | 设置文件的mimeType类型 |
助手函数提供了内容下载的参数,如果需要直接下载内容,可以在第三个参数传入true
:
public function download()
{
$data = '这是一个测试文件';
return download($data, 'test.txt', true);
}