Laravel自定义验证规则passes方法未触发,测试返回201而非422
问题根因
你的测试用例提交的请求体是空数组,请求参数中不存在questions字段。Laravel 验证器的默认逻辑是:如果请求中没有出现对应字段,除required系列规则外,其余所有规则(包括自定义Rule类)都会直接跳过执行,因此你的passes方法不会被触发,校验直接通过,请求进入控制器返回201状态码。
解决方案
方案1:补充必填规则适配你的自定义校验
在questions字段的规则中加上required,确保字段不存在时直接触发必填校验,字段存在时再走你自定义的数组非空校验:
public function rules() { echo "HERE"; return [ 'questions' => ['required', new ValidateArrayElementRule], 'questions.*.description' => 'required' ]; }
方案2:直接使用Laravel内置规则实现需求
你要的「数组至少包含一个元素」的校验不需要单独写自定义Rule,直接用内置的array+min:1规则即可实现:
public function rules() { echo "HERE"; return [ 'questions' => ['required', 'array', 'min:1'], 'questions.*.description' => 'required' ]; }
补充说明
如果你的业务逻辑允许questions字段不传,但只要传了就必须至少包含一个元素,把required规则换成present即可:present规则要求字段必须在请求参数中出现,不管值是什么,只要字段存在就会触发后续的校验规则。
内容的提问来源于stack exchange,提问作者Owen Kelvin
相关产品推荐
相关产品推荐

