🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
返回结果处理,归根结底 主要是有两点 数据结构和返回的数据类型  1、数据类型 :一般情况下,API 需要返回数据类型是JSON 2、数据结构:需要一个code来表明 返回结果状态,一个msg用户状态的描述 一个data用于包含所需要的返回的数据  明白上面两点,后续的无非就是就行封装,具体怎么封装,看个人习惯。 JsonResponse.php 文件 ~~~php namespace app\common\response; use app\common\ApiErrCode; use think\facade\Log; /** * Trait JsonResponse * @package app\http\response */ trait JsonResponse { /** * 成功时返回的数据 * @param $message * @param $data */ public function jsonSuccessData($data = ''){ return $this->jsonResponse(ApiErrCode::success['code'],ApiErrCode::success['msg'],$data); } /** * 错误时返回的数据 * @param $code * @param $message * @param $data */ public function jsonData($code,$message,$data = ''){ Log::error([ 'code'=>$code, 'message'=>$message, 'data'=>$data ]); return $this->jsonResponse($code,$message,$data); } /** * 接口返回数据结构 * @param $code * @param $message * @param $data */ private function jsonResponse($code,$message,$data){ $content = [ 'code'=>$code, 'msg'=>$message, 'data'=>$data, 'timestamp'=>time() ]; return json($content); } } ~~~ ApiErrCode.php 是错误码类  在开发过程 ,基础的判断是少不了的,不能相信来自用户的输入,当数据或者参数异常时,需要返回指定状态,告诉用户出了什么问题。 但是一个项目会有很多不同的错误码 ,规整到一起,方便管理。 ~~~php namespace app\common; /** * 错误码类 * @user yiqiu * @email 529857614@qq.com * @date 2021/2/19 20:01 * @blog http://www.upwqy.com */ class ApiErrCode{ /** * 通用错误 * code < 1000 */ const success = ['code'=>200,'msg'=>'成功']; const invalid_params = ['code'=>204,'msg'=>'参数错误']; const unknown_err = ['code'=>500,'msg'=>'未知错误']; const login_invalid = ['code'=>40001,'msg'=>'请重新登录。']; ~~~ 在需要使用的地方 ~~~php use JsonResponse; public function getList(){ return $this->jsonSuccessData($result) } ~~~ ThinkPHP6  在异常处理类中 增加JsonResponse返回,自定义返回结构 ~~~php namespace app; use app\common\ApiErrCode; use app\common\exception\BaseException; use app\common\response\JsonResponse; use think\db\exception\DataNotFoundException; use think\db\exception\ModelNotFoundException; use think\exception\Handle; use think\exception\HttpException; use think\exception\HttpResponseException; use think\exception\ValidateException; use think\Response; use Throwable; /** * 应用异常处理类 */ class ExceptionHandle extends Handle { use JsonResponse; /** * 不需要记录信息(日志)的异常类列表 * @var array */ protected $ignoreReport = [ HttpException::class, HttpResponseException::class, ModelNotFoundException::class, DataNotFoundException::class, ValidateException::class, ]; /** * 记录异常信息(包括日志或者其它方式记录) * * @access public * @param Throwable $exception * @return void * */ public function report(Throwable $exception): void { // 使用内置的方式记录异常日志 parent::report($exception); } /** * Render an exception into an HTTP response. * @access public * @param \think\Request $request * @param Throwable $e * @return Response */ public function render($request, Throwable $e): Response { // 其他错误交给系统处理 // return parent::render($request, $e); // 添加自定义异常处理机制 if($e instanceof BaseException){ $code = $e->getCode(); $message = $e->getMessage(); }else{ $code = $e->getCode(); if(!$code || $code < 0){ $code = ApiErrCode::unknown_err['code']; } $message = $e->getMessage() ? : ApiErrCode::unknown_err['msg']; } return $this->jsonData($code,$message); } } ~~~ 下面来看 BaseException ,这里表示基础异常类  其中 ApiErrCode 是定义的 错误码类 可以去[http://www.upwqy.com/details/216.html](http://www.upwqy.com/details/216.html)查看 ~~~php namespace app\common\exception; use app\common\ApiErrCode; use think\Exception; /** * 基础异常 * @user yiqiu * @email 529857614@qq.com * @date 2021/2/19 20:45 * @blog http://www.upwqy.com */ class BaseException extends \Exception { protected $code = ApiErrCode::unknown_err['code']; protected $message = ApiErrCode::unknown_err['msg']; public function __construct($params = []) { if(is_array($params) ){ if(isset($params['code']) && $params['code']){ $this->code = $params['code']; } if(isset($params['msg']) && $params['msg']){ $this->message = $params['msg']; } }else if(is_string($params)){ $this->message = $params; } parent::__construct($this->message, $this->code); } } ~~~ 然后我们可以自定义一些异常类 ,比如下面的 ParameterException.php 表示参数异常时的处理 ~~~php namespace app\common\exception; use app\common\ApiErrCode; class ParameterException extends BaseException { protected $code = ApiErrCode::invalid_params['code']; protected $message = ApiErrCode::invalid_params['msg']; } ~~~ 实例: ~~~php $user = User::where('id',1)->find(); if(!$user){ throw new ParameterException('用户不存在'); } ~~~ 当需要指定的异常,直接 使用  throw new ParameterException('用户不存在'); 即可,返回结果如下,并且可以在任何地方使用 ~~~javascript { "code": 204, "msg": "用户不存在", "data": "", "timestamp": 1622604524 } ~~~ THinkPHP5 在tp5框架中,我们需要手动创建应用异常处理类。ExceptionHandler.php 并且在配置中 修改配置 ~~~php 'exception_handle' => 'api\lib\exception\ExceptionHandler', ~~~ ThinkPHP5 中 应用异常处理类 需要手动创建  全局异常捕获 可以参考[http://www.upwqy.com/details/273.html](http://www.upwqy.com/details/273.html)