Laravel 9验证问题:可选数组必填键校验不生效
Laravel 9中空数组绕过
required_array_keys规则的原因及解决办法 问题场景
你的FormRequest中job字段的规则设置为:
'job' => 'nullable|array:id,attach_or_detach,message|required_array_keys:id,attach_or_detach'
测试时出现不符合预期的情况:
- 未传入
job数组:验证通过(符合nullable规则的预期) - 传入空
job数组:验证直接通过,但预期应因缺少id、attach_or_detach必填键而失败
核心原因
Laravel内置的required_array_keys规则存在逻辑特性:仅当目标数组「存在且非空」时,才会触发必填键的校验。当你传入空数组时,job字段确实存在,但数组本身没有任何元素,该规则会直接跳过校验流程,导致验证通过。
解决办法
要实现「只要job字段被传入(哪怕是空数组),就必须包含指定必填键」的校验逻辑,可以通过以下两种方式调整规则:
1. 闭包自定义校验逻辑
在FormRequest的rules方法中,用闭包精确控制校验条件:
public function rules() { return [ 'job' => [ 'nullable', 'array:id,attach_or_detach,message', function ($attribute, $value, $fail) { // 若job字段存在(非null),无论数组是否为空,都检查必填键 if (!is_null($value)) { $requiredKeys = ['id', 'attach_or_detach']; foreach ($requiredKeys as $key) { if (!array_key_exists($key, $value)) { $fail("The {$attribute} array must contain the {$key} key."); } } } }, ], // 数组内字段的规则 'job.id' => 'required|integer', 'job.attach_or_detach' => 'required|boolean', 'job.message' => 'nullable|string', ]; }
2. 拆分规则组合
通过required_if或条件规则,强制存在的数组必须包含指定键:
public function rules() { return [ 'job' => [ 'nullable', 'array:id,attach_or_detach,message', // 当job字段存在时,强制校验必填键 Rule::requiredIf(fn() => $this->has('job'))->then([ 'required_array_keys:id,attach_or_detach' ]), ], // 数组内字段规则同上 ]; }
内容的提问来源于stack exchange,提问作者JarsOfJam-Scheduler
相关产品推荐
相关产品推荐

