伪代码
//todo 验证码类型错误throw new XxxException(XxxException::SMS_CODE_IS_ERROR);
程序现在是不是应该停下来了,因为当你exception的时候 下面代码不会执行了
但是新的问题出现了,如果这样抛出异常,前端怎么办???????????
此处小声bb 前端处理不了跟我什么关系啊,我是后台啊,你有问题找前端啊.
那么我们假设一下 如果我们告诉前端的是
{code:'300000000','message:'短信验证码错误'}
是不是就很舒服了,前后端是一家 怎么能闹脾气呢
那么如果 Code统一,请问出问题你在发愁什么? 是你的phpstorm不存在属性追踪吗?
怎么实现???????????????
你问我,我也不到啊 我只能给你这个啊
<?php
namespace App\Exceptions;use App\Factory\ParseException; //解释异常的工厂 嫌弃名字长就没加Factory use App\Traits\ResponseTrait; //这个是我自己写的一个简单的trait 也会一并贴上去use Illuminate\Database\Eloquent\ModelNotFoundException;use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;use Illuminate\Http\JsonResponse;use Illuminate\Http\Response;use Illuminate\Support\Str;use Illuminate\Validation\ValidationException;use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;use Throwable;class Handler extends ExceptionHandler{
use ResponseTrait;
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
public function render($request, $e)
{
//数据库没查到数据或者数据是softdelete
if ($e instanceof ModelNotFoundException) {
return $this->error('500', '数据不存在或已删除');
}
//非允许请求方式
if ($e instanceof MethodNotAllowedHttpException) {
return $this->error('422', '请求方式错误');
}
//验证失败
if ($e instanceof ValidationException) {
return $this->error(412, current(current($e->errors())));
}
//这里是为了兼容其他的一些错误
if (Str::length($e->getMessage()) > 1 && Str::length($e->getCode()) > 1) {
return $this->error($e->getCode(), $e->getMessage());
}
//处理我们自己的错误
$result = ParseException::parseException($e);
//这里判断的原因很简单 因为可能这个code没有按照规范声明
if (is_array($result)) {
return $this->error($result['code'], $result['message']);
}
// Object Not Found 你懂我意思吧?
if ($e instanceof NotFoundHttpException) {
return $this->error('404', '页面路径不存在');
}
//这里可以根据自己是否需要做兜底而决定是否兜底
}}
parseException
<?php
namespace App\Factory;use Illuminate\Support\Facades\Log;class ParseException{
public static function parseException(\Throwable $exception)
{
//注解 不懂得话建议直接看文档->反射 ,我讲不明白这个东西
$annotation = new \ReflectionClass($exception);
//翻转 成code->constant
$values = array_flip($annotation->getConstants());
if (empty($values)) {
return false;
}
//拿到对应的constant
$constant = $values[$exception->getMessage()];
//constant反射
$annotation_text = new \ReflectionClassConstant($exception, $constant);
//获取属性注释内容
$comment = $annotation_text->getDocComment();
try {
//正则大法好 建议留意此处
preg_match("/Message\(\'(.*?)\'\)(\\r\\n|\\r|\\n)/U", $comment, $result);
} catch (\Throwable $e) {
return false;
}
if (false === isset($result[1])) {
return false;
}
return [
'code' => $exception->getMessage(),
'message' => $result[1]
];
}}
不要问我要 ResponseTrait 我相信一个简单的 响应实现你是ok的
这样实现的意义就是为了不管谁接手项目前端后端 看到错误信息一目了然,就算某天领导说不要需要告诉用户短信什么错了,就告诉他你短信错了,你只需要去改constant而已!
并且可读性高,ide支持 ,如果你觉得不合适,那我没辙了 ,我尽力了