---
## 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 ") 会持续的进行开源