为什么我的Symfony2 @UniqueEntity约束根本不起作用?

时间:2012-08-17 07:43:30

标签: symfony constraints

我的应用程序中有以下实体类:

<?php

namespace ...;

// use ...
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;;
// ...

/**
 * @ORM\Table(name="sc_user")
 * @ORM\Entity(repositoryClass="...\UserRepository")
 * @ORM\HasLifecycleCallbacks()
 * @UniqueEntity(fields={"email", "username"})
 */
class User implements UserInterface, \Serializable, EquatableInterface
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     *
     * @Assert\NotBlank(groups={"registration"})
     * @Assert\Email(groups={"registration"})
     */
    private $email;

    /**
     * @var string $username
     *
     * @ORM\Column(name="username", type="string", length=32, unique=true)
     *
     * @Assert\NotBlank(groups={"registration"})
     */
    private $username;

    // ...
}

正在忽略@UniqueEntity约束。我尝试了不同的口味,包括:

@UniqueEntity(fields={"email", "username"})

@UniqueEntity(fields={"email"})
@UniqueEntity(fields={"username"})

并且,根据此处的Symfony2文档:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

@UniqueEntity("email")
@UniqueEntity("username")

我没做什么,有效。我没有按预期获得表单验证错误,而是获得以下异常:

  

SQLSTATE [23000]:完整性约束违规:1062重复条目   'admin@scire.com'为关键'UNIQ_D8183973E7927C74'

这是错的!有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:23)

问题解决如下:

@UniqueEntity(fields={"email"}, groups={"registration"})
@UniqueEntity(fields={"username"}, groups={"registration"})

注册组丢失了,我需要将它们分成两个单独的注释。

答案 1 :(得分:13)

此问题的另一个原因是,如果您使用表单集合并包含处理关联实体的子表单,则必须在根目录中设置cascade_validationtrue以及所有子表单

请参阅Symfony documentation中的提示:

  

要激活对CategoryType的验证,请将cascade_validation选项添加到TaskType

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\TaskBundle\Entity\Task',
        'cascade_validation' => true,
    ));
}

<强>更新

为了确保您的子实体得到验证,甚至有更好的方法。出于这个原因,Symfony提供了Valid约束。来自documentation

  

<强>有效
  此约束用于对作为要验证的对象的属性嵌入的对象启用验证。这允许您验证对象以及与之关联的所有子对象。

答案 2 :(得分:3)

请注意ignoreNull

例如,使用pid正常工作(可以为null):

constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
  fields: [page, pid, position]
  errorPath: page
  groups: [Menu]
  message: "Page already exists with that parent"
  ignoreNull: false

答案 3 :(得分:2)

尝试添加

framework:
    validation:
        enable_annotations: true

到您的应用配置