ant*_*ion 13 validation inheritance symfony doctrine-orm
我有一个patner,一个买家和一个继承用户类的管理类
当我想添加合作伙伴时,验证器不起作用
* @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"})
Run Code Online (Sandbox Code Playgroud)
如果我选择已经在数据库中的"伙伴"的用户名,它会向我显示正确的验证错误.但是,如果我选择已经在数据库中的"买方"的用户名,则没有验证,并且在我的数据库中存在唯一的字段错误.
班级用户
<?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 ...
}
Run Code Online (Sandbox Code Playgroud)
班级合作伙伴
<?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;
/**
* Antho\Test\CoreBundle\Entity\Partner
*
* @ORM\Table(name="partner")
* @ORM\Entity(repositoryClass="Antho\Test\CoreBundle\Entity\PartnerRepository")
*/
class Partner extends User
{
/**
* @ORM\OneToMany(targetEntity="Restaurant", mappedBy="partner", cascade={"remove", "persist"})
*/
private $restaurants;
/**
* @var string $company
*
* @ORM\Column(name="company", type="string", length=255)
*/
private $company;
public function __construct()
{
parent::__construct();
$this->restaurants = new \Doctrine\Common\Collections\ArrayCollection();
$this->isValid = false;
}
GETTER and SETTER ...
}
Run Code Online (Sandbox Code Playgroud)
类买家
<?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;
/**
* Antho\Test\CoreBundle\Entity\Buyer
*
* @ORM\Table(name="buyer")
* @ORM\Entity(repositoryClass="Antho\Test\CoreBundle\Entity\BuyerRepository")
*/
class Buyer extends User
{
/**
* @var string $address
*
* @ORM\Column(name="address", type="string", length=255)
*/
private $address;
/**
* @var string $city
*
* @ORM\Column(name="city", type="string", length=255)
*/
private $city;
/**
* @var string $zip
*
* @ORM\Column(name="zip", type="string", length=255)
*/
private $zip;
/**
* @var boolean $newsletter
*
* @ORM\Column(name="newsletter", type="boolean")
*/
private $newsletter;
public function __construct()
{
parent::__construct();
if ($this->newsletter === null) {
$this->newsletter = false;
}
}
GETTER and SETTER ...
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这是一个古老的悬而未决的问题,但人们仍然可能面临这个问题。这可能会帮助并节省他们的时间。
\n\n问题是,UniqueEntityValidator 默认情况下仅采用当前(正在检查的)实体的存储库。换句话说,如果您提交合作伙伴,它只会检查合作伙伴条目。它不考虑其他实体,例如“single_table”继承映射中的“买家”或“用户”。
\n\n要解决您的问题,您只需添加entityClass
父类名称的注释属性即可:
@DoctrineAssert\\UniqueEntity(fields="username", message="Ce nom d\'utilisateur est d\xc3\xa9j\xc3\xa0 utilis\xc3\xa9, veuillez en choisir un autre.", groups={"registration", "account"}, entityClass="Antho\\Test\\CoreBundle\\Entity\\User")\n
Run Code Online (Sandbox Code Playgroud)\n\n这部分entityClass =“Antho\\Test\\CoreBundle\\Entity\\User”实际上解决了您的问题。
\n\n在这种情况下,验证器将遍历您的所有用户条目(也包括其子条目)。
\n我的两分钱。不要假装自己是正确答案。
从子类中删除所有不需要的字段@Table
并使字段可见 ( protected
)。我也做了同样的事情(使用 Symfony 2.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;
}
Run Code Online (Sandbox Code Playgroud)
儿童班:
/**
* @ORM\Entity
*/
class Tag extends Meta { }
/**
* @ORM\Entity
*/
class Keyword extends Meta { }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4982 次 |
最近记录: |