Validation Symfony2+;条令-验证一对多实体集合

Validation Symfony2+;条令-验证一对多实体集合,validation,symfony,collections,doctrine,one-to-many,Validation,Symfony,Collections,Doctrine,One To Many,我有一个表单来创建一个新实体。该实体具有也以该形式输入的其他实体的集合 我想使用集合中实体的验证选项来验证这些实体,但它不起作用。检查“主要”实体(人员)的验证规则,但不检查地址列表集合(地址)中实体的验证规则。当我在字段中输入无效信息时,提交的表单将成功验证 在本例中,街道的注释不用于验证 class Person { ... /** * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascad

我有一个表单来创建一个新实体。该实体具有也以该形式输入的其他实体的集合

我想使用集合中实体的验证选项来验证这些实体,但它不起作用。检查“主要”实体(人员)的验证规则,但不检查
地址列表
集合(地址)中实体的验证规则。当我在字段中输入无效信息时,提交的表单将成功验证

在本例中,街道的注释不用于验证

class Person 
{
    ...

    /**
     * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
     */
    protected $addressList;

    ....
}

class Address
{
    ...
    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="addressList")
     * @ORM\JoinColumn(name="person_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $owner;

    /**
     * @ORM\Column(type="string", length=75)
     * @Assert\MinLength(
     *     limit=3,
     *     message="Street must have atleast {{ limit }} characters."
     * )
     */
    protected $street;

    ...

}
如何获取表单以验证提供的地址实体?

您还可以将“”约束与“”约束一起使用:

/**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
 * @Assert\All({
 *     @Assert\Valid
 * })
 */

protected $addressList;

我也有同样的问题,但通过以下方法解决了:

/**
 * @ORM\OneToMany(
 *  targetEntity="Entity",
 *  mappedBy="mappedEntity",
 *  cascade={"persist" , "remove"}
 * )
 * @Assert\Valid
 */
我用这个:

use Symfony\Component\Validator\ExecutionContextInterface;

class Person 
{
...

/**
 * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"})
 */
protected $addressList;

....

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context)
{
    if (!$this->getAddressList()->count()) {
        $context->addViolationAt(
            'addressList',
            'You must add at least one address',
            array(),
            null
        );
    }
}
}

只需添加注释断言,如下所示

/** 
 * @Assert\Count(
 *      min = "1",
 *      minMessage = "You must specify at least one"
 * )
 * @Assert\Valid 
 * 
 */
protected $name_of_collection_property;

我通过将
'cascade\u validation'=>true
添加到PersonType的
getDefaultOptions()
数组中解决了这个问题。你确定吗?这使我在2.1中“约束有效不能嵌套在约束Symfony\Component\Validator\Constraints\All中。您只能直接在字段或方法上声明有效约束。”不再确定。我想当时我正在使用2.0,我不得不处理一个类似的问题。如果它不起作用,也许我应该删除我的答案。我在3.3和@Assert\Valid()中遇到了类似的问题,但没有@Assert\All环绕它似乎可以正常工作。而且,很明显,我们也要摆脱“…Valid不能嵌套在…All…”中的错误消息。还要将@Assert\Valid添加到$addressList中,这将是完整的解决方案。这将验证列表中的每个地址是否仅为有效的地址实体。但是,如果您想进行更多验证,请查看@sergey Polishook下面的答案
@Assert\Valid
,它可以验证集合中许多一侧的所有约束,这正是我所需要的。