1,重写render方法的测试
- tp5中出现异常如果一直向上抛,最后会被框架自己的全局异常处理类Handle类的render方法捕获。所以要自定义tp5的全局异常处理就要重写Handle类的render方法。
- 新建一个ExceptionHandler.php继承于Handle类。
(新建lib目录与api目录同级是因为一旦自定义的全局异常处理层构建完成之后,lib目录下的exception就像一个类库一样,不仅api控制器能调用它,其他的也可以调用它。)
<?php
namespace app\lib\exception;
use think\Exception;
use think\exception\Handle;
class ExceptionHandler extends Handle {
public function render(Exception $ex){
return json('1235566');
}
}
重点来了:重写了tp5的Handle类的render方法,一定一定要去config.php里面更改一下配置
- 现在重写render方法返回123456做个测试,看是不是向上抛出的异常都会被render方法处理。
首先来看错误异常的流向,在model层banner.php中模拟操作数据库出现异常并向上抛出。
在控制器层调用model中的方法,并没有对方法做处理,这样全局异常就会捕获这个异常,那么render方法就会执行
render方法执行
2,根据自定义的异常的类型来完成render方法
-
首先构建由于用户的行为导致的异常处理
在lib目录下新建一个BaseException类来初始化通一描述信息,并且继承于exception基类。
-
第二步:自定义对应的控制器异常类并继承于BaseException并定义异常描述信息。
-
完成ExceptionHandler类中的render方法
(render方法来判断是自己抛出的自定义异常,还是服务器的内部异常并做相应的处理)
<?php
namespace app\lib\exception;
use think\Exception;
use think\exception\Handle;
use think\Request;
class ExceptionHandler extends Handle {
private $code;
private $msg;
private $errorCode;
//需要返回客户端当前请求的URL路径
public function render(Exception $e) {
if ($e instanceof BaseException) {
//BaseException是自定义异常的基类
//如果是自定义的异常,就返回自定义异常下的异常信息
$this->code = $e->code;
$this->msg = $e->msg;
$this->errorCode = $e->errorCode;
} else {
//否则就是服务器的内部错误
$this->code = 500;
$this->msg = "服务器内部错误,不想告诉你";
$this->errorCode = 999;
}
//还要返回请求的url地址
$request = Request::instance();
$result = [
'msg' => $this->msg,
'error_code' => $this->errorCode,
'request_url' => $request->url()
];
return json($result, $this->code);
}
}