灵活运用 - 方便地返回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的判断,所以不会影响模板的输出

这样就不需要增加类的继承体系了,爽歪歪是不是!?