在save 方法中创造一个报错,如下,无data变量,但是echo,
//post 需要定义$id
public function save()
{
echo $data;
$post_data = input('post.');
$data = array(
'post_data' => $post_data
);
return show(0, '保存成功!', $data);
}
自带报错异常,是调用的根目录下\thinkphp\library\think\exception 中Handle.php类的render方法
public function render(Exception $e)
{
if ($e instanceof HttpException) {
return $this->renderHttpException($e);
} else {
return $this->convertExceptionToResponse($e);
}
}
我们需要新建一个类,重新渲染render方法,改变抛出异常的方式
在thinkphpwu\application\common\lib\exception 目录下创建ApiHandleException.php文件
具体代码如下:
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);
}
}
在application目录下的config.php中找到exception_handle
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => 'app\common\lib\exception\ApiHandleException',
我们在执行业务时,会遇到与后台判断不符合要求的异常处理,并抛出,如果只是用框架本身的异常类,并不能满足业务需求,
比如我们修改一个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);
}
我们请求时,会发现,http的状态码是500,这并不合理,我们需要封装异常类来定义httpcode码
在根目录的application\common\lib\exception下创建ApiException.php 类
具体代码如下:
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的值已修改了
在application目录的config.php配置文件中 ,找到app_debug
// 应用调试模式
'app_debug' => false, //false为关闭,true为开启
关闭调试模式 返回的是如下内容: