学习thinkphp5不可预知的内部异常api数据输出解决方案

学习thinkphp5不可预知的内部异常api数据输出解决方案

    • 原报错异常
    • 封装报错异常类
      • 1、创建文件ApiHandleException.php
      • 2、修改config.php配置
    • postman测试
    • 封装业务抛出异常类
    • debug模式开启和关闭

原报错异常

在save 方法中创造一个报错,如下,无data变量,但是echo,


    //post 需要定义$id
    public function save()
    {

        echo $data;

        $post_data = input('post.');
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

请求报错,抛出异常
学习thinkphp5不可预知的内部异常api数据输出解决方案_第1张图片

自带报错异常,是调用的根目录下\thinkphp\library\think\exception 中Handle.php类的render方法
学习thinkphp5不可预知的内部异常api数据输出解决方案_第2张图片

    public function render(Exception $e)
    {
        if ($e instanceof HttpException) {
            return $this->renderHttpException($e);
        } else {
            return $this->convertExceptionToResponse($e);
        }
    }

我们需要新建一个类,重新渲染render方法,改变抛出异常的方式

封装报错异常类

1、创建文件ApiHandleException.php

在thinkphpwu\application\common\lib\exception 目录下创建ApiHandleException.php文件
学习thinkphp5不可预知的内部异常api数据输出解决方案_第3张图片
具体代码如下:



namespace app\common\lib\exception;


//引用异常类
use think\exception\Handle;

//继承异常类
class ApiHandleException extends Handle
{

    //自定义http状态码
    public static $httpCode = 500;

    //覆盖原有render方法
    public function render(\Exception $e)
    {
        return show(0, $e->getMessage(), [], self::$httpCode);
    }

}

2、修改config.php配置

在application目录下的config.php中找到exception_handle

学习thinkphp5不可预知的内部异常api数据输出解决方案_第4张图片
修改:

    // 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle' => 'app\common\lib\exception\ApiHandleException',

postman测试

学习thinkphp5不可预知的内部异常api数据输出解决方案_第5张图片

封装业务抛出异常类

我们在执行业务时,会遇到与后台判断不符合要求的异常处理,并抛出,如果只是用框架本身的异常类,并不能满足业务需求,

比如我们修改一个save方法

    //post 需要定义$id
    public function save()
    {
        $post_data = input('post.');
        if ($post_data['url'] != 'qipa250.com') { 
        //抛出异常      
            exception('域名不正确');
        }
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

学习thinkphp5不可预知的内部异常api数据输出解决方案_第6张图片
我们请求时,会发现,http的状态码是500,这并不合理,我们需要封装异常类来定义httpcode码

在根目录的application\common\lib\exception下创建ApiException.php 类
学习thinkphp5不可预知的内部异常api数据输出解决方案_第7张图片
具体代码如下:



namespace app\common\lib\exception;

//引用异常类
use think\Exception;


//继承异常类
class ApiException extends Exception
{
    //自定义http状态码
    public $message = '';
    public $httpCode = 400;
    public $code = 0;

    /*
     * 渲染抛出异常的状态码和信息
     */
    public function __construct($message = "", $httpCode = 0, $code = 0)
    {
        $this->message = $message;
        $this->httpCode = $httpCode;
        $this->code = $code;
    }
}

在控制器中save方法中引用

//在class的顶部引用
use app\common\lib\exception\ApiException;


    //post 需要定义$id
    public function save()
    {
        $post_data = input('post.');
        if ($post_data['url'] != 'qipa250.com') {
            //抛出异常
            throw new ApiException('域名不正确', 444, 1);
        }
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

修改ApiHandleException 类中的render方法

    //覆盖原有render方法
    public function render(\Exception $e)
    {
        //如果debug模式开启,则直接返回报错信息
        if (config('app_debug') == true) {
            return parent::render($e);
        }
        //否则debug模式关闭,返回格式化的报错信息
        if ($e instanceof ApiException) {
            self::$httpCode = $e->httpCode;
        }
        return show(0, $e->getMessage(), [], self::$httpCode);
    }

再次请求,可以看到httpcode的值已修改了

学习thinkphp5不可预知的内部异常api数据输出解决方案_第8张图片

debug模式开启和关闭

在application目录的config.php配置文件中 ,找到app_debug

    // 应用调试模式
    'app_debug' => false, //false为关闭,true为开启

关闭调试模式 返回的是如下内容:

学习thinkphp5不可预知的内部异常api数据输出解决方案_第9张图片
开启调试模式,则返回如下内容:
更能直观的看到报错信息,生产环境中,一定要关闭调试模式
学习thinkphp5不可预知的内部异常api数据输出解决方案_第10张图片

你可能感兴趣的:(Api,Php,Thinkphp框架)