为什么我的约束验证在表单生成器上声明但在我的实体上配置时被忽略?

时间:2015-08-12 17:23:34

标签: forms validation symfony

我有一个ProjetContact实体,其roles关系。 ProjetContact实体必须至少具有一个角色。所以我添加了一个Count约束作为注释。

/**
 * @var Collection
 * 
 * @Assert\Count(min=1, minMessage="Vous devez sélectionner au moins un rôle par contact")
 * 
 * @ORM\ManyToMany(targetEntity="ContactRole")
 * @ORM\JoinTable(
 *   name="projet_contact_role",
 *   joinColumns={
 *     @ORM\JoinColumn(name="projet_contact_role_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="role_id", referencedColumnName="id")
 *   }
 * ) 
 */
 private $roles;

但是,这不起作用,约束被忽略。用户可以在不选择任何角色的情况下提交表单。

我发现如果我在表单构建器上配置验证器,它就可以工作。

$builder
  ->add('roles', 'entity', array(
    'label' => 'Rôles',
    'class' => 'MyIntranetBundle:ContactRole',
    [...]
    'constraints' => new Count(
      array('min'=>1, 'minMessage'=>'Vous devez sélectionner au moins un rôle par contact')
    )
  ))
->[...]

我更希望直接在我的实体上配置验证器。为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

两个可能的原因:

  1. 您未在实体定义中正确导入Assert(应为use Symfony\Component\Validator\Constraints as Assert;
  2. 您为表单定义了验证组,但未包含Default组。

答案 1 :(得分:0)

我必须在使用@Assert\Valid()的父实体上添加ProjetContact

/**
* @var Collection
* 
* @Assert\Valid()
* 
* @ORM\OneToMany(targetEntity="ProjetContact", mappedBy="projet", cascade={"persist","remove"})
*/
private $contacts;