灵活运用 - 方便地返回Json ¶
作者:KK
发表日期:2016.10.15
控制器方法返回JSON给前端的时候,我们通常都要将这个JSON的第一级别统一起来,很多人都用过TP框架,我就先拿TP框架来说,它的控制器$this->success
、$this->error
和$this->ajaxReturn
都最终在底层返回了这样结构的JSON:
{
msg : '返回消息',
status : 自定义响应代码,
data : '',
}
因为如果不统一的话,前端的判断就很不统一,并且有时候不好封装统一的判断了嘛,好了接下来咱们也要在Yii里实现返回统一的JSON结构给前端
我个人喜欢这样的结构命名,不过也仅仅是命名不同而已
{
message : '返回消息',
code : 自定义响应代码,
data : null,
}
其中code
默认为0(正常),非0就不正常:
基本实现方法 ¶
如果用最基本的方法实现是下面这样的,在action里面:
return Yii::configure(Yii::$app->response, [
'format' => \yii\web\Response::FORMAT_JSON,
'data' => [
'message' => '余额不足',
'code' => 1,
'data' => null
],
]);
但是每个action都这样写format、data、message、code…………会不会很重复很烦啊,而且如果写错写漏就不好了
方便的方法1:扩展Response,添加快速构造JSON的方法 ¶
namespace app\lib;
class Response extends \yii\web\Response{
public function alert($message, $code = 1, $data = null){
$this->format = self::FORMAT_JSON;
$this->data = [
'message' => $message,
'code' => $code,
'data' => $data
]
return $this;
}
}
//修改response组件的配置后,就可以这样调用了嘛
return Yii::$app->response->alert('余额不足');
方便的方法2:监听response组件的beforeSend
事件做手脚 ¶
修改response组件的配置如下:
'response' => [
'on beforeSend' => function($event){
$response = $event->sender;
if(
$response->format != \yii\web\Response::FORMAT_JSON //没设定format为JSON
&& is_array($response->data) //数组
){
$data = $response->data;
$response->data = [
'message' => $data[0],
'code' => isset($data[1]) ? $data[1] : 0,
'data' => isset($data[2]) ? $data[2] : '',
];
$response->format = \yii\web\Response::FORMAT_JSON;
}
}
],
于是action可以这样用:
return ['余额不足'];
return ['操作成功!', 0];
return ['搜索结果', 0, $dataList];
return $this->render('xxx'); //此时返回的是string,beforeSend里有is_array的判断,所以不会影响模板的输出
这样就不需要增加类的继承体系了,爽歪歪是不是!?