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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:53:14