Laravel9 Jetstream+Inertia+Vue3中如何将403错误转为Flash消息?
解决方案:区分Inertia与普通Axios请求处理403错误
核心思路是精准区分请求类型,对Inertia请求用Flash消息展示错误,对普通Axios请求返回原始403错误响应,具体实现如下:
修改异常处理逻辑
在app/Exceptions/Handler.php的render方法中,增加请求类型判断:
public function render($request, Throwable $e) { $response = parent::render($request, $e); // 仅处理403授权异常 if ($e instanceof AuthorizationException && $response->status() === 403) { // 针对Inertia请求:用Flash消息提示,返回上一页 if ($request->isInertia()) { session()->flash('flash', [ 'bannerStyle' => 'danger', 'banner' => $e->getMessage() ?: trans('error'), ]); return back(); } // 针对普通Axios请求:返回原始403响应,保留错误信息 return $response; } return $response; }
关键说明
$request->isInertia()是Inertia提供的内置方法,能准确识别当前请求是否由Inertia发起,比手动判断请求头更可靠- 对Inertia请求的处理逻辑和你原来的一致,通过Flash消息展示错误,避免触发默认的全屏403模态窗
- 普通Axios请求直接返回原始403响应,前端可以正常捕获状态码和错误文本,不影响业务逻辑
前端无需额外修改
Jetstream自带的Banner组件会自动读取session中的flash消息并渲染,所以不需要调整Vue代码。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

