10

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

<?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 键 'UNIQ_D8183973E7927C74' 的重复条目 'admin@scire.com'

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

4

4 回答 4

25

问题解决如下:

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

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

于 2012-08-17T13:26:58.650 回答
14

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

请参阅Symfony 文档中的提示:

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

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

更新:

为了确保您的子实体得到验证,还有更好的方法。SymfonyValid正是出于这个原因提供了约束。从文档

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

于 2013-07-05T08:54:17.457 回答
4

请注意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
于 2015-04-18T13:38:13.607 回答
2

尝试添加

framework:
    validation:
        enable_annotations: true

到您的应用配置

于 2012-08-17T09:33:03.030 回答