Validation 具有实体继承的Symfony2 Uniquentity验证错误
我有一个patner、一个buyer和一个admin类,它们继承了一个user类 当我想添加合作伙伴时,验证程序不工作Validation 具有实体继承的Symfony2 Uniquentity验证错误,validation,inheritance,symfony,doctrine-orm,Validation,Inheritance,Symfony,Doctrine Orm,我有一个patner、一个buyer和一个admin类,它们继承了一个user类 当我想添加合作伙伴时,验证程序不工作 * @DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}) * @DoctrineAssert\Uniq
* @DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"})
* @DoctrineAssert\UniqueEntity(fields="mail", message="Cette adresse mail est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"})
如果我为数据库中已经存在的“合作伙伴”选择用户名,它将显示正确的验证错误。但是,如果我选择数据库中已经存在的“买家”的用户名,则不会进行验证,并且在我的数据库中存在唯一的字段错误
类用户
<?php
namespace Antho\Test\CoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
/**
* Antho\Test\CoreBundle\Entity\User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="Antho\Test\CoreBundle\Entity\UserRepository")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"user" = "User", "partner" = "Partner", "buyer" = "Buyer", "admin" = "Admin"})
* @ORM\HasLifecycleCallbacks()
* @DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"})
* @DoctrineAssert\UniqueEntity(fields="mail", message="Cette adresse mail est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"})
*/
class User implements UserInterface
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $username
*
* @ORM\Column(name="username", type="string", length=255, unique=true)
*/
private $username;
/**
* @var string $lastName
*
* @ORM\Column(name="last_name", type="string", length=255)
*/
private $lastName;
/**
* @var string $firstName
*
* @ORM\Column(name="first_name", type="string", length=255)
*/
private $firstName;
/**
* @var string $mail
*
* @ORM\Column(name="mail", type="string", length=255, unique=true)
*/
private $mail;
/**
* @var string $password
*
* @ORM\Column(name="password", type="string", length=255)
*/
private $password;
public function __construct()
{
if ($this->createdAt === null) {
$this->createdAt = new \DateTime('now');
}
$this->isEnabled = true;
}
public function __toString()
{
return $this->username;
}
GETTER and SETTER ...
}
我的两分钱。不要假装是正确的答案
从子类中删除所有不需要的@Table
,并使字段可见(受保护的
)。我也做了同样的事情(使用symfony2.0.x),它就像一个魔咒
它与您的代码略有不同,这里的标记(或关键字)名称对于每个用户都是唯一的。但您可以通过任何方式对其进行测试:
/**
* @ORM\Entity
* @ORM\Table(
* name="meta",
* uniqueConstraints={
* @ORM\UniqueConstraint(columns={"name", "user_id", "type"})
* },
* indexes={
* @ORM\index(columns={"description"}),
* @ORM\index(columns={"type"})
* }
* )
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"tag" = "Tag", "keyword" = "Keyword"})
* @UniqueEntity(fields={"name", "user"})
*/
abstract class Meta
{
protected $name;
protected $user;
}
儿童班:
/**
* @ORM\Entity
*/
class Tag extends Meta { }
/**
* @ORM\Entity
*/
class Keyword extends Meta { }
这是一个古老的未回答的问题,然而人们仍然可能面临这个问题。这可能有助于节省他们的时间
问题在于,默认情况下,UniquentityValidator只接受当前(正在检查的)实体的存储库。换句话说,如果您提交Partner,它只检查Partner条目。它不考虑其他实体,例如“单表”继承映射中的买方或用户
要解决您的问题,只需将父类名称添加到注释entityClass
属性中:
@DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}, entityClass="Antho\Test\CoreBundle\Entity\User")
这一部分实际上解决了您的问题
在这种情况下,验证器将检查您的所有用户条目(也包括其子条目)。这似乎没问题。我唯一的猜测是注释没有被识别。试着像文档中那样做:验证器不工作。我认为继承有一个问题,“单表继承是一种继承映射策略,其中层次结构的所有类都映射到一个数据库表”。你似乎在尝试为每个类使用不同的表?不,我为每个类使用相同的表我认为@Cerad是正确的。我的意思是,看看@表
注释。他们都指向不同的名字……谢谢@Tomas,这也是我问题的解决方案。我有一个用户类和一个扩展用户类的成员类。当我想创建一个成员obj时,验证现在就可以了。这应该是一个可接受的答案,正好回答了这个问题
/**
* @ORM\Entity
*/
class Tag extends Meta { }
/**
* @ORM\Entity
*/
class Keyword extends Meta { }
@DoctrineAssert\UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà utilisé, veuillez en choisir un autre.", groups={"registration", "account"}, entityClass="Antho\Test\CoreBundle\Entity\User")