Laravel验证:数组字段status含Other时如何用字符串规则设置status_other必填
结论
不能直接使用Laravel原生的字符串格式验证规则实现该需求,你尝试的两种写法不生效是规则本身的逻辑限制导致的。
失效原因
required_if规则的原生逻辑是校验指定字段的完整值是否完全等于给定的参数值:你传递的status是数组类型,required_if:status,Other会直接判断整个数组是否等于字符串Other,永远不成立,自然不会触发必填校验。- 你写的
required_if:status,in:Other存在语法错误:required_if不支持嵌套解析in规则,只会把in:Other整体当做要匹配的字段值,同样不可能和数组类型的status匹配。
替代方案
如果不想用闭包形式的Rule::requiredIf,可以自定义验证规则实现字符串格式的调用:
- 先在
app/Providers/AppServiceProvider.php的boot方法中注册自定义规则:
use Illuminate\Support\Facades\Validator; public function boot() { Validator::extend('required_if_contains', function ($attribute, $value, $parameters, $validator) { // 验证参数完整性 if (count($parameters) < 2) { throw new \InvalidArgumentException('规则required_if_contains需要至少两个参数:字段名、目标值'); } $arrayField = $parameters[0]; $target = $parameters[1]; $data = $validator->getData(); // 数组字段不存在/不是数组时跳过校验 if (!isset($data[$arrayField]) || !is_array($data[$arrayField])) { return true; } // 数组包含目标值时,当前字段不能为空 if (in_array($target, $data[$arrayField])) { return isset($value) && trim((string)$value) !== ''; } return true; }); }
- 在语言包
resources/lang/zh-CN/validation.php中添加自定义错误提示:
'required_if_contains' => '当:0包含:1时,:attribute字段为必填项',
- 之后就可以直接用字符串格式的规则了:
'status' => 'nullable|array', 'status_other' => 'required_if_contains:status,Other',
内容的提问来源于stack exchange,提问作者DarkLeafyGreen
相关产品推荐
相关产品推荐

