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

jos*_*erk 10 constraints symfony

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

<?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;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

@UniqueEntity约束被忽略.我尝试了不同的口味,包括:

@UniqueEntity(fields={"email", "username"})
Run Code Online (Sandbox Code Playgroud)

@UniqueEntity(fields={"email"})
@UniqueEntity(fields={"username"})
Run Code Online (Sandbox Code Playgroud)

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

@UniqueEntity("email")
@UniqueEntity("username")
Run Code Online (Sandbox Code Playgroud)

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

SQLSTATE [23000]:完整性约束违规:1062重复条目'admin@scire.com'用于密钥'UNIQ_D8183973E7927C74'

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

jos*_*erk 23

问题解决如下:

@UniqueEntity(fields={"email"}, groups={"registration"})
@UniqueEntity(fields={"username"}, groups={"registration"})
Run Code Online (Sandbox Code Playgroud)

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

  • 嗨,约瑟夫,似乎有点老问题,但我遇到了同样的问题 - 只是想知道 - 你是否需要,我不知道,__创建那个验证组?我完全按照您的方式添加了唯一的实体字段,仅在电子邮件和手机上添加,但它仍然给我一个例外而不是验证错误.有任何想法吗? (2认同)

nai*_*rch 13

另一个原因问题是,如果你使用的形式收藏,包括子形式处理相关的实体,您必须设置cascade_validationtrue根和所有子形式.

请参阅Symfony文档中的提示:

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

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

更新:

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

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