Files
xk-api-yii/common/foundation/JsonResponseFormatter.php

150 lines
5.7 KiB
PHP

<?php
/**
* Created by chatfeed.
* @Author:$Id$
*/
namespace common\foundation;
use common\services\DataEncryptor;
use Yii;
use yii\helpers\Json;
class JsonResponseFormatter extends \yii\web\JsonResponseFormatter
{
private $defaultErrorCode = -1;
public static function formatData($data,$errno=0,$msg=''){
// if(empty($data)) $data = new \stdClass();
if (empty($data)) {
$data = [];
} else {
if (array_key_exists('list', $data)) {
$data['list'] = self::aseEncode($data['list']);
} else {
$data = self::aseEncode($data);
}
}
return ['data'=>$data,'errcode'=>$errno,'msg'=>$msg];
}
public $encrypt = true;//是不加密
/**
* Formats response data in JSON format.
* @param \yii\web\Response $response
*/
protected function formatJson($response)
{
//$response->getHeaders()->set('Content-Type', 'text/plain; charset=UTF-8');
//$response->getHeaders()->set("Access-Control-Allow-Origin","*");
if ($response->data !== null) {
$options = $this->encodeOptions;
if ($this->prettyPrint) {
$options |= JSON_PRETTY_PRINT;
}
$errcode = 0;
$msg = '';
$data=[];
if(!$response->isSuccessful){
$response->statusCode = 200;
$errcode=-1;
if(Yii::$app->errorHandler->exception){
// if(Yii::$app->errorHandler->exception instanceof )
if(isset(Yii::$app->errorHandler->exception->statusCode)){
$errcode = Yii::$app->errorHandler->exception->statusCode;
}elseif (Yii::$app->errorHandler->exception->getCode()>0){
$errcode=Yii::$app->errorHandler->exception->getCode();
}else{
$errcode = $this->defaultErrorCode;
}
$msg= YII_DEBUG?Yii::$app->errorHandler->exception->getMessage():'服务器内部错误';
}
}else{
$data = $response->data;
}
$response->data = self::formatData($data,$errcode,$msg);
// var_dump($response->data);exit;
// if(!$response->isSuccessful){
// $response->statusCode = 200;
// if($response->data['code']>20000)
// $code = $response->data['code'];
// else
// $code = ErrorCode::APP_EXCEPTION;
// $redirect = '';
// $response->data = BController::ApiResponse([],$response->data['message'],$code,$redirect);
// }
// if(isset(Yii::$app->params['response_encrpyt']) && Yii::$app->params['response_encrpyt']){
// $encryption = new MCrypt();
// $response->content = $encryption->encrypt(Json::encode($response->data, $options));
// }else{
$response->content = Json::encode($response->data, $options);
// }
}
}
/**
* Formats response data in JSONP format.
* @param \yii\web\Response $response
*/
protected function formatJsonp($response)
{
$response->getHeaders()->set('Content-Type', 'application/javascript; charset=UTF-8');
if ($response->data !== null) {
$options = $this->encodeOptions;
if ($this->prettyPrint) {
$options |= JSON_PRETTY_PRINT;
}
if(!$response->isSuccessful){
$response->statusCode = 200;
if($response->data['code']>20000)
$code = $response->data['code'];
else
$code = $this->defaultErrorCode;
$redirect = '';
// $response->data = BController::ApiResponse([],$response->data['message'],$code,$redirect);
}
// if(isset(Yii::$app->params['response_encrpyt']) && Yii::$app->params['response_encrpyt']){
// $encryption = new MCrypt();
// $response->content = $encryption->encrypt(Json::encode($response->data, $options));
// }else{
// $response->content = Json::encode($response->data, $options);
// }
}
$response->data= ['data'=>$response->data,'callback' => Yii::$app->getRequest()->get('callback')];
if (is_array($response->data) && isset($response->data['data'], $response->data['callback'])) {
$response->content = sprintf('%s(%s);', $response->data['callback'], Json::htmlEncode($response->data['data']));
} elseif ($response->data !== null) {
$response->content = '';
Yii::warning("The 'jsonp' response requires that the data be an array consisting of both 'data' and 'callback' elements.", __METHOD__);
}
}
private static function aseEncode($data)
{
// return $data;
if (is_array($data)) {
foreach ($data as $key => &$value) {
if (is_array($value)) {
$value = self::aseEncode($value); // 递归处理子数组
} else {
// 数据库中加密的方法需要解密
if (in_array($key, \Yii::$app->params['database_ase_list']) && is_encrypted($value)) {
$value = (new DataEncryptor(Yii::$app->params['ase_key']))->decrypt($value);
}
if (in_array($key, \Yii::$app->params['aseList'])) {
if (is_string($key)) {
$value = ase_encode($value); // 加密指定键值
}
}
}
}
}
return $data;
}
}