Laravel中如何仅在前序验证规则通过时执行后续规则?
Laravel条件验证:仅满足前置条件时执行后续规则
你遇到的问题是因为Laravel默认会执行字段上的所有规则,不管required_if是否触发。要实现仅当id_country=128时才校验fiscalcode的格式,最直接的方式是用Laravel的sometimes方法,它能让你根据条件动态添加验证规则。
解决方案代码
$input = request()->get('data'); $rules = [ "id_country" => "required", ]; // 初始化验证器 $validator = Validator::make($input, $rules, $messages); // 仅当id_country等于128时,才对fiscalcode应用必填和格式校验规则 $validator->sometimes('fiscalcode', 'required|fiscalcode', function ($input) { return $input->id_country == 128; });
原理说明
sometimes方法的作用是:当第三个参数的闭包返回true时,才给指定字段添加第二个参数里的验证规则。- 这里的逻辑是:只有当
id_country的值为128时,才会要求fiscalcode必填,并且执行你的自定义fiscalcode格式校验规则;如果id_country不是128,fiscalcode字段不会被做任何校验。
另一种写法(数组规则形式)
如果你习惯把规则都写在数组里,也可以用Rule::requiredIf结合条件判断:
use Illuminate\Validation\Rule; $input = request()->get('data'); $rules = [ "id_country" => "required", "fiscalcode" => [ Rule::requiredIf(fn () => $input['id_country'] == 128), // 仅当requiredIf触发时,才执行fiscalcode格式校验 function ($attribute, $value, $fail) use ($input) { if ($input['id_country'] == 128 && !preg_match('/你的税务代码正则/', $value)) { $fail('税务代码格式不正确'); } } ] ]; $validator = Validator::make($input, $rules, $messages);
这种方式是在自定义闭包规则里先判断前置条件,再执行格式校验,同样能达到需求。
内容的提问来源于stack exchange,提问作者SoulArcangel
相关产品推荐
相关产品推荐

