Symfony 6.4中如何验证允许为空的数组属性
解决空数组验证失败的问题
你遇到的问题根源在于直接在数组属性上添加#[Assert\Valid]时,即便数组为空,Symfony验证器仍会触发不必要的验证逻辑。正确的写法是把Valid约束嵌套到Assert\All内部,让校验仅作用于数组中的元素,空数组则直接放行。
修改后的代码如下:
use App\Api\Dto\WorkHour as WorkHourDto; use Symfony\Component\Serializer\Annotation\Groups as SerializerGroups; use Symfony\Component\Validator\Constraints as Assert; // ... #[Assert\All([ new Assert\Type(type: WorkHourDto::class), new Assert\Valid(groups: ['create', 'update']), ])] // 可选:显式约束属性必须为数组,避免非数组值传入 #[Assert\Type(type: 'array')] #[SerializerGroups(['view', 'create', 'update'])] public array $workHours = [];
关键说明
Assert\All默认允许空数组(allowEmptyArray选项默认值为true),空数组不会触发内部的Type和Valid校验;- 将
Valid放到All内部后,只有数组中存在WorkHourDto对象时,才会验证这些对象自身的约束,空数组无元素需要校验,自然不会报错; - 额外添加的
#[Assert\Type(type: 'array')]可以确保workHours必须是数组类型(包括空数组),避免非数组值被传入。
如果你的WorkHourDto本身带有必填约束,这种写法也能保证:只有数组里存在对象时,才会校验这些对象的必填字段,空数组完全合法。
内容的提问来源于stack exchange,提问作者Calamity Jane
相关产品推荐
相关产品推荐

