验证对象Symfony 4.2的CollectionType数组

时间:2019-02-19 14:52:10

标签: symfony validation symfony4

我正在创建一个表单,其中可以容纳未定义数量的输入集合,这些集合在按“添加”按钮后出现。我正在遵循此文档:https://symfony.com/doc/current/form/form_collections.html,一切似乎都正常。我可以添加,删除,保存和编辑主表单以及输入集合。现在,我正在尝试验证输入,但是在验证CollectionType实体时遇到了问题。 对于主表单输入,我正在使用以下验证:

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Type("string")
 */
private $name;

对于CollectionType,我的验证如下所示:

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Tag", cascade={"persist"})
 * @Assert\All({
 *     @Assert\Collection(
 *     fields = {
 *         "name" = {
 *              @Assert\NotBlank
 *              @Assert\Type("string")
 *             )
 *         },
 *         "desc" = {
 *              @Assert\NotBlank
 *              @Assert\Type("string")
 *             )
 *         }
 *     },
 *     allowMissingFields = false,
 *     allowExtraFields = false
 * )
 * })
 *
 */
private $tags;

我收到此错误:

This value should be of type array|(Traversable&ArrayAccess).

我不知道这是否有帮助,但是通过转储表单错误,我可以看到:

-propertyPath: "data.tags[0]"
        -invalidValue: Tag {#850 ▼
          -id: null
          -name: null
          -desc: null
        }

我也已经定义了对Tag实体变量的验证,但仍然无法正常工作。

如果删除“ @Assert \ All”部分,我将得到:

This field is missing. 

data.tags [name]和data.tags [desc]错误。 以及:

This field was not expected.

对于data.tags [0]

编辑: 我最终根据https://symfony.com/doc/current/validation/custom_constraint.html

创建了自定义验证器

1 个答案:

答案 0 :(得分:0)

这些规则:

* @Assert\All({
 *     @Assert\Collection(
 *     fields = {
 *         "name" = {
 *              @Assert\NotBlank
 *              @Assert\Type("string")
 *             )
 *         },
 *         "desc" = {
 *              @Assert\NotBlank
 *              @Assert\Type("string")
 *             )
 *         }
 *     },
 *     allowMissingFields = false,
 *     allowExtraFields = false
 * )
 * })

应放在您要验证的每个字段的Tag实体中