Laravel异常处理时登录凭证不匹配跳通用错误页如何改为跳转登录页
问题原因
你当前的异常处理逻辑是只要关闭调试模式,无论抛出什么类型的异常都会直接返回自定义500页,跳过了Laravel框架本身对验证异常、认证异常等业务类异常的默认处理逻辑,因此登录时用户名密码不匹配抛出的验证异常也被拦截跳转到了通用错误页。
解决方案
调整render方法的逻辑顺序,先对框架自带的特殊异常走默认处理逻辑,剩余的未知异常再统一走500页兜底,修改步骤如下:
- 先在
Handler.php顶部引入需要判断的异常类:
use Illuminate\Validation\ValidationException; use Illuminate\Auth\AuthenticationException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
- 修改
render方法的逻辑:
public function render($request, Exception $exception) { // 验证异常(含登录表单验证失败)走框架默认逻辑,自动跳转回上一页带错误信息 if ($exception instanceof ValidationException) { return parent::render($request, $exception); } // 未登录认证异常走框架默认跳转逻辑 if ($exception instanceof AuthenticationException) { return parent::render($request, $exception); } // 404异常可自定义页面兜底 if ($exception instanceof NotFoundHttpException) { if(!config('app.debug', false)){ return view('errors.404'); } return parent::render($request, $exception); } // 仅未知异常在非调试模式下返回500页 if(!config('app.debug', false)){ return view('errors.500'); } return parent::render($request, $exception); }
注意事项
- 原代码中
env('APP_DEBUG')建议替换为config('app.debug'),避免项目执行config:cache生成配置缓存后,env()方法读取失效导致逻辑错误 - 后续有其他需要单独处理的异常类型,都可以在通用500判断之前添加对应类型判断即可
内容的提问来源于stack exchange,提问作者Chamod Wijesena
相关产品推荐
相关产品推荐

