Symfony2 + Doctrine - 验证一对多实体集合

Bra*_*klg 13 collections validation doctrine one-to-many symfony

我有一个表单来创建一个新实体.该实体还有一系列其他实体,这些实体也以该形式输入.

我想使用集合中实体的验证选项来验证这些实体,但它不起作用.检查"主"实体(Person)的验证规则,但addressList不检查集合(Address)中实体的验证规则.当我在字段中输入无效信息时,已成功验证提交的表单.

在此示例中,街道的注释不用于验证.

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;

    ...

}
Run Code Online (Sandbox Code Playgroud)

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

小智 15

我有同样的问题,但解决了:

/**
 * @ORM\OneToMany(
 *  targetEntity="Entity",
 *  mappedBy="mappedEntity",
 *  cascade={"persist" , "remove"}
 * )
 * @Assert\Valid
 */
Run Code Online (Sandbox Code Playgroud)


Ser*_*huk 7

我用这个:

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
        );
    }
}
}
Run Code Online (Sandbox Code Playgroud)

http://symfony.com/doc/current/reference/constraints/Callback.html


小智 5

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

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


Jul*_*ien 0

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

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

protected $addressList;
Run Code Online (Sandbox Code Playgroud)

  • 你确定吗?这给了我“约束 Valid 不能嵌套在约束 Symfony\Component\Validator\Constraints\All 内。您只能直接在字段或方法上声明 Valid 约束。” 在2.1中 (2认同)