You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 00:15:05