webman中不能使用die()和exit()等函数方法,用了会影响服务。
在框架中想要在任何地方都停止程序向后面继续执行,并响应错误到客户端怎么办呢?
我们可以自定义异常处理类,默认的异常处理在composer的代码文件中,我们不能修改,但是我们可以通过修改配置文件,使用自己的异常错误处理类。
├── app 应用目录
├── config 配置目录
│ ├── exception.php 异常处理配置文件
├── public 静态资源目录
在框架配置文件中,有一个配置文件 exception.php
我们需要修改他的配置,指派成自己的异常处理类即可。
<?php
return [
// '' => support\exception\Handler::class,//官方原来的,我们注释
'' => \app\common\exception\Handler::class,//我们自己的
];
配置文件修改完完了,我们需要再去创建自己的异常处理类,就是\app\common\exception\Handler
├── app 应用目录
├── ├──common 公共目录
│ ├────── exception 异常处理目录
│ ├────────── Handler.php 自定义异常处理类
然后定义自己的异常处理代码,我们可以复制框架原来的代码,根据自己的需求改造,
下面演示代码为插件(wekyun/webman_lib)的参数验证错误处理:
在代码中增加了如下代码,如果错误是CheckException类型的错误,就去直接响应客户端json数据,错误码和错误提示都可以获取,错误码可以修改该插件的配置,也可以在此处写死(根据自己的业务来),插件默认参数错误的code=203。
//Check插件抛出的验证错误
if ($exception instanceof CheckException) {
return json(['code' => $exception->getCode(), 'msg' => $exception->getMessage(), 'desc' => '参数验证错误提示']);
}
完整的代码如下,如果是wekyun/webman_lib插件,可以按照此教程,直接复制下面的完整代码!
<?php
namespace app\common\exception;
use support\exception\BusinessException;
use Throwable;
use Webman\Exception\ExceptionHandler;
use Webman\Http\Request;
use Webman\Http\Response;
use Wekyun\WebmanLib\common\exception\CheckException;
/**
* Class Handler
* @package support\exception
*/
class Handler extends ExceptionHandler
{
public $dontReport = [
BusinessException::class,
];
public function report(Throwable $exception)
{
parent::report($exception);
}
public function render(Request $request, Throwable $exception): Response
{
if (($exception instanceof BusinessException) && ($response = $exception->render($request))) {
return $response;
}
//自定义:Check插件抛出的验证错误
if ($exception instanceof CheckException) {
return json(['code' => $exception->getCode(), 'msg' => $exception->getMessage(), 'desc' => '参数验证错误提示']);
}
return parent::render($request, $exception);
}
}
使用wekyun/webman_lib插件的验证功能之时,如果验证报错提示字段不合法,就会走这里的错误处理,注意配置文件一定要改,否则不生效!
刚测试插件,如果是插件,请修改插件的exception.php,否则不生效。
可以的