Symfony:如何将Assert\Valid应用于数组的每个元素?

3

我有一个由类FormatInstance给出的复杂数据类型,其中包含一些具有属性的属性,例如#[Assert\NotBlank]

我正在将此类用作我的实体中数组的一部分,如下所示:

    #[ORM\Column(type: Types::JSON, nullable: true)]
    #[Assert\All([
        new AssertFormatInstance
    ])]
    private ?array $formatInstances = [];

AssertFormatInstance断言旨在验证我的FormatInstance属性的相互作用,但我也想通过“正常”验证来运行数组的每个元素,以检查非自定义断言属性,如上述的Assert\NotBlank等。

但事实证明,Assert\Valid不能嵌套到Assert\All中,像这样做:

    #[ORM\Column(type: Types::JSON, nullable: true)]
    #[Assert\All([
        new AssertFormatInstance
    ])]
    #[Assert\Valid]
    private ?array $formatInstances = [];

这也行不通。 (编辑:它实际上确实解决了问题,但“真正”的错误掩盖了这个问题。仍然接受了已接受的答案,因为有关集合的有价值的信息。)

有没有可能以某种方式使这个工作起来,或者我必须在我的AssertFormatInstanceValidator中“手动”检查所有内容?

1个回答

1

如果您想确保您的$formatInstances中的所有元素都是FormatInstance类型,您可以在All约束中使用Type约束。

否则,我建议您使用Collection而不是array,并直接在属性上使用Valid约束(而不是在All约束中)。正如您在文档中所看到的,如果将traverse选项设置为true(默认情况下已经为true),它将验证集合中的每个对象。


1
接受这个答案作为使用集合和遍历选项的提示。但是,我必须说把 #[Assert\Valid] 放在 "All" 外面确实起了作用,但“真正”的问题被我的代码中的另一个错误掩盖了。 - Wolfone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接