Laravel验证:嵌套属性缺失未触发验证,是否正常及如何解决?
问题解答
这不是预期行为
当Payload缺失info.type时,'info.type'的required规则未触发,核心原因是你的Rule::requiredIf逻辑存在问题:直接通过request()->info['type']访问不存在的数组键会抛出Undefined array key错误,导致整个验证流程提前中断,info.type的验证规则根本没机会执行。
修复方案
要让info.type的验证在属性缺失时正常生效,需要做两处调整:
强制验证
info为必填数组
添加info字段的验证规则,确保info本身存在且是数组类型,这样嵌套字段的验证才能正常触发:'info' => ['required', 'array'], 'info.type' => ['required', 'string'], 'info.cas' => Rule::requiredIf(request()->input('info.type') === 'chemical'),安全访问请求参数
用request()->input('info.type')替代request()->info['type'],前者在字段不存在时会返回null,不会抛出错误,保证验证流程完整执行。同时注意原规则里的大小写问题:Payload中type值是小写的chemical,但规则里写的是大写Chemical,这会导致requiredIf判断失效,需要统一大小写。
验证逻辑说明
添加info的数组验证后,当Payload缺失info或info不是数组时,会先触发info的验证错误;当info存在但缺失type时,info.type的required规则会正常触发,返回对应的错误提示;只有当info.type等于chemical时,info.cas才会被要求必填。
内容的提问来源于stack exchange,提问作者Riza Khan
相关产品推荐
相关产品推荐

