🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
--- ## 1. 如何自定义 laravel 的业务异常 #### 编写 `CodeResponse` 常量异常和状态码 > 首先我们要明确如何规定异常状态码 -401 参数值不合法 -402 参数值不对 -1 成功 -1 失败 #### 参考状态 const SUCCESS = [1, '成功']; const FAIL = [-1, '']; const PARAM_ILLEGAL = [401, '参数不合法']; const PARAM_VALUE_ILLEGAL = [402, '参数值不对']; ## 2. 创建 BusinessException ![图片alt](/media/editor/1630028976219_20210827094938433958.png ''图片title'') #### 重写构造方法 namespace App\Exceptions; use Exception; class BusinessException extends Exception { public function __construct(array $codeResponse, $info = '') { list($code, $message) = $codeResponse; parent::__construct($info ?: $message, $code); } } #### 添加 Handler 中的 `render` 方法把异常进行统一格式化 /** * Render an exception into an HTTP response. * @param \Illuminate\Http\Request $request * @param \Throwable $exception * @return Response * * @throws \Throwable */ public function render($request, Throwable $exception) { //validation Exception Unified processing and formatting if($exception instanceof ValidationException){ return response()->json([ 'errno' => CodeResponse::PARAM_VALUE_ILLEGAL[0], 'errmsg' => CodeResponse::PARAM_VALUE_ILLEGAL[1], ]); } //Business Exception Unified processing and formatting if ($exception instanceof BusinessException) { return response()->json([ 'errno' => $exception->getCode(), 'errmsg' => $exception->getMessage() ]); //格式化成json } return parent::render($request, $exception); } #### 载入异常类到 `Handler` protected $dontReport = [ BusinessException::class ]; ## 3. 把异常处理方法统一放到公共父类控制器中 class BlogController extends Controller { /** * @param array $codeResponse * @param null $data * @param string $info * @return JsonResponse */ protected function codeReturn(array $codeResponse, $data = null, $info = '') { list($errno, $errmsg) = $codeResponse; $ret = ['errno' => $errno, 'errmsg' => $info ?: $errmsg]; if (!is_null($data)) { if(is_array($data)){ $data = array_filter($data, function ($item){ return $item !== null; }); } $ret['data'] = $data; } return response()->json($ret); } /** * @param null $data * @return JsonResponse */ protected function success($data = null) { return $this->codeReturn(CodeResponse::SUCCESS, $data); } /** * @param array $codeResponse * @param string $info * @return JsonResponse */ protected function fail(array $codeResponse = CodeResponse::FAIL, $info = '') { return $this->codeReturn($codeResponse, null, $info); } /** * @param $isSuccess * @param array $codeResponse * @param null $data * @param string $info * @return JsonResponse */ protected function failOrSuccess( $isSuccess, array $codeResponse = CodeResponse::FAIL, $data = null, $info = '' ) { if($isSuccess){ return $this->success($data); } return $this->fail($codeResponse, $info); } } ## 4. 如何使用我们自定义的异常类 #### 部署路由, 我们建立一个 `blog.php` , 这里我们暂时先不用权限认证和jwt来校验 Route::post('auth/login','AuthController@login'); //账号登录 #### 注入路由服务 `RouteServiceProvider` protected $namespace = 'App\\Http\\Controllers'; //这里需要打开由于原来是注释的情况 public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); Route::prefix('blog') //这里是我们新加的 ->namespace($this->namespace.'\Blog') ->group(base_path('routes/blog.php')); }); } #### 编写控制器方法 class AuthController extends BlogController { public function login() { return $this->success(''); } } #### 编写测试文件 ![图片alt](/media/editor/1630033578747_20210827110622138683.png ''图片title'') > #### 注意我们这里的命令空间, 测试成功返回 Time: 00:04.932, Memory: 22.00 MB OK (1 test, 1 assertion) ## 5. 浏览器查看 #### 因为是 post 请求所以我们改变规则(方便测试,后期涉及到安全方面的都需要 any) Route::any('auth/login','AuthController@login'); //账号登录 ![图片alt](/media/editor/1630033869146_20210827111111270122.png ''图片title'') #### 格式化用 chome 的 json 插件 ## 使用 postman 进行测试。 效果是一样的我这里就不演示了 --- ## 总结 > #### 以上我们就对 laravel8.5 版本进行了一次异常业务和测试的封装, 该项目是: [laravel 8 + angular + markdown ](https://github.com/whitexiong/laravel-angular-blog "laravel 8 + angular + markdown ") 会持续的进行开源