如何在Symfony中验证仅含指定字符串值的数组类型roles字段
问题原因
Collection约束的适用场景是校验键名规则固定的关联数组,它会强制要求数组必须包含配置中声明的所有键,同时不允许出现未声明的额外键。
你的roles字段存储的是数字索引数组,结构类似[0 => 'ROLE_USER', 1 => 'ROLE_ADMIN'],和Collection要求的键名规则完全不匹配,才会出现“指定键缺失、存在意外字段”的报错。
实现方案
你需要组合三类约束完成需求:
- 先校验
roles字段本身格式为数组 - 遍历数组内的每一个元素做统一校验
- 限制每个元素的取值只能是你允许的两个角色标识
完整代码示例:
<?php use Symfony\Component\Validator\Constraints as Assert; use Doctrine\ORM\Mapping as ORM; class User { #[ORM\Column(type: 'json')] #[Assert\Type(type: 'array', message: '角色字段必须为数组格式')] #[Assert\All([ new Assert\Choice( choices: ['ROLE_USER', 'ROLE_ADMIN'], message: '角色值无效,仅允许传入ROLE_USER、ROLE_ADMIN' ) ])] // 可选约束:禁止重复传入相同角色 // #[Assert\Unique(message: '不可重复分配同一角色')] // 可选约束:要求至少传入1个角色 // #[Assert\Count(min: 1, minMessage: '至少需要分配一个角色')] private array $roles = []; public function setRoles(array $roles): self { $this->roles = $roles; return $this; } // 其余实体方法... }
上述写法会自动校验传入的roles数组中所有值,只要出现非指定范围的字符串就会触发校验错误,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者MilMike
相关产品推荐
相关产品推荐

