【问题标题】:Symfony2+Doctrine - Validating one-to-many collection of entitiesSymfony2+Doctrine - 验证实体的一对多集合
【发布时间】:2012-05-02 09:09:40
【问题描述】:

我有一个创建新实体的表单。该实体有一组其他实体,这些实体也输入到该表单中。

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

在此示例中,街道的注释未用于验证。

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;

    ...

}

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

【问题讨论】:

  • 我通过将 'cascade_validation' => true 添加到 PersonType 的 getDefaultOptions() 数组来解决此问题。

标签: validation symfony collections doctrine one-to-many


【解决方案1】:

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

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

【讨论】:

  • 这将验证列表中的每个地址是否仅是有效的地址实体。但是,如果您想要更多验证,请查看下面的@sergey-polischook 答案
  • @Assert\Valid 使其验证集合的 ManyToOne 端的所有约束,这正是我所需要的。
【解决方案2】:

我用这个:

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
        );
    }
}
}

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

【讨论】:

  • 还将@Assert\Valid 添加到$addressList,这将是完整的解决方案
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 你确定吗?这给了我“约束 Valid 不能嵌套在约束 Symfony\Component\Validator\Constraints\All 内。您只能直接在字段或方法上声明 Valid 约束。”在 2.1 中
    • 不确定了。我想我当时使用的是 2.0,我不得不处理类似的问题。如果它不起作用,也许我应该删除我的答案。
    • 我在 3.3 和 @Assert\Valid() 中遇到了类似的问题,没有 @Assert\All 围绕它似乎工作正常。而且,显然,也摆脱了“......有效不能嵌套在......所有......”错误消息。
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2014-11-20
    相关资源
    最近更新 更多