Symfony 7中使用#[MapRequestPayload]映射嵌套请求数据时验证报错
解决Symfony #[MapRequestPayload]嵌套数组DTO验证错误问题
问题原因
当前错误的核心是:Symfony的MapRequestPayload无法自动将请求中的数组元素映射为CreateQuestionDto对象,导致验证时判定元素为普通数组而非目标DTO类型。
解决方案
需要明确告知Serializer数组元素的具体类型,以下两种方式均可实现:
方式1:使用PHP泛型数组类型(Symfony 6.2+ 支持)
修改CreateQuizDto中的$questions属性声明,添加泛型类型提示:
class CreateQuizDto { #[Assert\NotBlank()] #[Assert\Length(min: 1, max: 255)] public string $label; #[Assert\Type('countable')] #[Assert\All([ new Assert\Type(CreateQuestionDto::class), new Assert\Valid() ])] public array<CreateQuestionDto> $questions; // 泛型类型声明 }
方式2:使用PHPDoc注解兼容旧版本
若PHP版本不支持泛型,通过PHPDoc注解指定数组元素类型:
class CreateQuizDto { #[Assert\NotBlank()] #[Assert\Length(min: 1, max: 255)] public string $label; /** * @var CreateQuestionDto[] */ #[Assert\Type('countable')] #[Assert\All([ new Assert\Type(CreateQuestionDto::class), new Assert\Valid() ])] public array $questions; }
补充说明
- 确保Symfony项目已启用Serializer组件的
object_normalizer,默认配置下会自动处理DTO映射,若有自定义配置需确认相关规则。 - 将
#[Assert\Valid]合并到#[Assert\All]规则中,可递归验证每个CreateQuestionDto对象的字段。
内容的提问来源于stack exchange,提问作者krisforerr4567
相关产品推荐
相关产品推荐

