返回结果处理,归根结底 主要是有两点 数据结构和返回的数据类型
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)
- thinkphp6执行流程(一)
- php中use关键字用法详解
- Thinkphp6使用腾讯云发送短信步骤
- 路由配置
- Thinkphp6,static静态资源访问路径问题
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳实践
- Thinkphp6.0 搜索器使用方法
- 从已有安装包(vendor)恢复 composer.json
- tp6with的用法,表间关联查询
- thinkphp6.x多对多如何添加中间表限制条件
- thinkphp6 安装JWT
- 缓存类型
- 请求信息和HTTP头信息
- 模型事件用法
- 助手函数汇总
- tp6集成Alipay 手机和电脑端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6笔记
- TP6(thinkphp6)队列与延时队列
- thinkphp6 command(自定义指令)
- command(自定义指令)
- 本地文件上传
- 缓存
- 响应
- 公共函数配置
- 七牛云+文件上传
- thinkphp6:访问多个redis数据源(thinkphp6.0.5 / php 7.4.9)
- 富文本编辑器wangEditor3
- IP黑名单
- 增删改查 +文件上传
- workerman 定时器操作控制器的方法
- 上传文件到阿里云oss
- 短信或者邮箱验证码防刷代码
- thinkphp6:访问redis6(thinkphp 6.0.9/php 8.0.14)
- 实现关联多个id以逗号分开查询数据
- thinkphp6实现邮箱注册功能的细节和代码(点击链接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成带logo的二维码(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql数据库使用事务(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,创建过滤IP的中间件
- 源码解析请求流程
- 验证码生成
- 权限管理
- 自定义异常类
- 事件监听event-listene
- 安装与使用think-addons
- 事件与多应用
- Workerman 基本使用
- 查询用户列表按拼音字母排序
- 扩展包合集
- 查询用户数据,但是可以通过输入用户昵称来搜索用户同时还要统计用户的文章和粉丝数
- 根据图片的minetype类型获取文件真实拓展名思路
- 到处excel
- 用imagemagick库生成缩略图
- 生成zip压缩包并下载
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源码分析三】 APP类之父, 容器Container类
- thinkphp6表单重复提交解决办法
- 小程序授权
- 最简单的thinkphp6导出Excel
- 根据访问设备不同访问不同模块
- 服务系统
- 前置/后置中间件
- 给接口api做签名验证(php 8.1.1 / thinkphp v6.0.10LTS )
- 6实现邮箱注册功能的细节和代码(点击链接激活方式)
- 使用前后端分离的验证码(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分离:用jwt+middleware做用户登录验证(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分离多图上传
- thinkphp 分组、页面跳转与ajax
- thinkphp6 常用方法文档
- 手册里没有的一些用法
- Swagger 3 API 注释
- PHP 秒级定时任务
- thinkphp6集成gatewayWorker(workerman)实现实时监听
- thinkphp6按月新增数据表
- 使用redis 实现消息队列
- api接口 统一结果返回处理类
- 使用swoole+thinkphp6.0+redis 结合开发的登录模块
- 给接口api做签名验证
- ThinkPHP6.0 + UniApp 实现小程序的 微信登录
- ThinkPHP6.0 + Vue + ElementUI + axios 的环境安装到实现 CURD 操作!
- 异常$e
- 参数请求验证自定义和异常错误自定义