Laravel项目中实现Toastr仅展示验证/通知错误、屏蔽404错误的方案咨询
Laravel项目中实现Toastr仅展示验证/通知错误、屏蔽404错误的方案咨询
嘿,我来帮你搞定这个问题!你遇到的核心问题是404异常属于系统级的页面不存在错误,和表单验证、业务通知错误不是同一类型,之前的逻辑只要有错误就触发Toastr,导致404页面时因为没有正确的错误上下文让Toastr处理,进而网站崩溃。我们可以从后端异常处理和前端触发逻辑两个层面来解决:
第一步:在异常处理器中隔离404错误,不写入错误会话
你已经在Handler.php里处理404页面了,只需要确保当捕获到NotFoundHttpException时,不要把错误信息存入session的errors集合中,这样前端就不会读取到404相关的错误。修改你的render方法如下:
public function render($request, Throwable $e) { // 捕获404异常 if ($e instanceof NotFoundHttpException) { // 根据请求路径判断返回后台还是前台的404页面 $viewPath = $request->is('admin/*') ? 'errors.admin.404' : 'errors.frontend.404'; // 返回404视图,并且不传递错误信息到session return response()->view($viewPath, [], 404); } // 其他异常走默认处理逻辑(比如验证错误会自动存入errors会话) return parent::render($request, $e); }
第二步:前端精准触发Toastr,只响应验证和自定义通知错误
原来的前端代码只要errors->any()就触发Toastr,现在可以拆分逻辑,只针对表单验证错误和业务自定义通知错误触发:
<script> // 处理表单验证错误 @if($errors->any()) @foreach($errors->all() as $error) toastr.error('{{ $error }}'); @endforeach @endif // 处理自定义业务通知错误(比如你手动用session()->flash('error', '消息')设置的) @if(session('error')) toastr.error('{{ session('error') }}'); @endif </script>
额外注意点
- 确保你的404视图文件中,即使引入了Toastr的脚本,因为没有
errors集合或session('error')数据,Toastr不会执行错误提示逻辑,也就不会导致页面崩溃。 - 如果之前有其他自定义异常需要用Toastr展示,也可以在
Handler.php中针对性地将错误消息存入session('error'),而不是混入errors集合里。
这样调整后,Toastr就只会在表单验证失败或者你主动触发业务通知错误时弹出,404页面会正常展示,不会再出现崩溃问题啦!
备注:内容来源于stack exchange,提问作者Abasilim Joe Abasilim
相关产品推荐
相关产品推荐

