thinkphp api接口 统一结果返回处理类


20210602 修正

 wqy的笔记:http://www.upwqy.com/details/216.html

返回结果处理,归根结底 主要是有两点 数据结构和返回的数据类型 

1、数据类型 :一般情况下,API 需要返回数据类型是JSON

2、数据结构:需要一个code来表明 返回结果状态,一个msg用户状态的描述 一个data用于包含所需要的返回的数据 

明白上面两点,后续的无非就是就行封装,具体怎么封装,看个人习惯。

JsonResponse.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 是错误码类 

在开发过程 ,基础的判断是少不了的,不能相信来自用户的输入,当数据或者参数异常时,需要返回指定状态,告诉用户出了什么问题。

但是一个项目会有很多不同的错误码 ,规整到一起,方便管理。

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'=>'请重新登录。'];   

在需要使用的地方

use JsonResponse;
public function getList(){
  return $this->jsonSuccessData($result)
}

ThinkPHP6 

在异常处理类中 增加JsonResponse返回,自定义返回结构

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);

    }
}

ThinkPHP5 中 应用异常处理类 需要手动创建 

全局异常捕获 可以参考 http://www.upwqy.com/details/273.html