异常树
Exception
ErrorException
RuntimeException
运行时异常UnexpectedValueException
未预期值异常Symfony\Component\HttpKernel\Exception\HttpException
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
Illuminate\Http\Exception\HttpResponseException
http response 异常Illuminate\Database\Eloquent\ModelNotFoundException
找不到 Model 异常Illuminate\Database\Eloquent\MassAssignmentException
Illuminate\Contracts\Encryption\DecryptException
解密异常Illuminate\Contracts\Encryption\EncryptException
加密异常Illuminate\Contracts\Validation\ValidationException
Illuminate\Contracts\Validation\UnauthorizedException
LogicException
InvalidArgumentException
参数错误异常Illuminate\Contracts\Queue\EntityNotFoundException
BadFunctionCallException
BadMethodCallException
调用方法异常
PDOException
Illuminate\Database\QueryException
数据库查询异常
Illuminate\Auth\Access\UnauthorizedException
未认证用户Illuminate\Contracts\Filesystem\FileNotFoundException
文件不存在Illuminate\Session\TokenMismatchException
Token不匹配异常Illuminate\Http\Exception\PostTooLargeException
post 数据量大异常Illuminate\Container\BindingResolutionException
Illuminate\Contracts\Container\BindingResolutionException
异常概要
Exception
Exception
是所有异常的基类。
1 | Exception { |
异常捕捉中间件
首先,定义中间件 CatchExceptionMiddleware
1 | use Closure; |
然后在 某个ServiceProvider
中的 boot
方法执行注册:
1 | use Illuminate\Routing\Router; |
支持跨域中间件
1 | use Closure; |
其中有以下需要注意的地方:
- 对于跨域访问并需要伴随认证信息的请求,需要在
XMLHttpRequest
实例中指定withCredentials
为true
; - 这个中间件你可以根据自己的需求进行构建,如果需要在请求中伴随认证信息(包含
cookie
,session
)那么你就需要指定Access-Control-Allow-Credentials
为true
, 因为对于预请求来说如果你未指定该响应头,那么浏览器会直接忽略该响应; - 在响应中指定
Access-Control-Allow-Credentials
为 true 时,Access-Control-Allow-Origin
不能指定为*
; - 后置中间件只有在正常响应时才会被追加响应头,而如果出现异常,这时响应是不会经过中间件的;
如果想要设置 Access-Control-Allow-Origin
的值为 请求的 referer
值:1
2
3
4
5
6
7$request_referer_info = parse_url($request->header('Referer'));
$request_referer = count($request_referer_info) > 1
? $request_referer_info['scheme'] . '://' . $request_referer_info['host']
. (isset($request_referer_info['port']) ? ':' . $request_referer_info['port'] : '')
: '*'
$response->header('Access-Control-Allow-Origin', $$request_referer);
参考阅读 Laravel 开启跨域功能;