Laravel 8 触发单条验证规则却显示所有规则错误的解决办法
问题原因
你遇到的所有验证错误都输出的问题,核心是两处错误:
- 验证逻辑没有正确执行
你只使用validator()辅助函数创建了验证器实例,没有触发验证流程,也没有将验证失败的错误正确闪存到Session中。甚至有可能你错误地将自定义的$error_messages全量错误提示数组直接传递给了视图,导致所有错误都被渲染出来。 - 模板错误输出逻辑冗余
你在模板中针对每个字段的每一条验证规则都单独调用了错误输出逻辑,虽然正常情况下未触发的规则不会输出内容,但这种写法冗余且容易出问题。
解决方案
1. 修正控制器验证逻辑
两种可选写法,任选其一即可:
写法一:自动处理验证失败(推荐)
直接调用请求对象的validate方法,Laravel会自动判断验证结果,验证失败时自动重定向回表单页,同时将错误信息和用户输入闪存到Session:
$validated = $request->validate($rules, $error_messages); // 此处写验证通过后的逻辑,比如用户创建、数据入库等
写法二:手动判断验证状态
如果你需要自定义验证失败后的处理逻辑,可以手动判断验证结果:
$validator = validator($request->all(), $rules, $error_messages); if ($validator->fails()) { return back()->withErrors($validator)->withInput(); } // 此处写验证通过后的逻辑
2. 简化模板错误输出
不需要针对每个规则单独写输出代码,直接按字段输出错误即可,每个字段只会展示实际触发的第一条错误提示:
以用户名字段为例,原来的4行错误输出代码可以直接简化为:
{!! $errors->first('username', '<span style="color: red;" class="help-block">:message</span>') !!}
也可以使用Laravel自带的@error指令,写法更清晰:
@error('username') <span style="color: red;" class="help-block">{{ $message }}</span> @enderror
其余邮箱、密码字段的错误输出都可以按同样逻辑简化,删除针对单条规则的单独输出代码即可。
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

