gpt4 book ai didi

validation - Symfony2 UniqueEntity 实体继承验证错误

转载 作者:行者123 更新时间:2023-12-02 11:28:36 24 4
gpt4 key购买 nike

我有一个合作伙伴、一个买家和一个继承用户类的管理类

当我想添加合作伙伴时,验证器不起作用

 * @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 ...
}

类(class)伙伴

<?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 ...
}

买家类别

<?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 ...
}

最佳答案

这是一个古老的悬而未决的问题,但人们仍然可能面临这个问题。这可能会帮助并节省他们的时间。

问题在于,UniqueEntityValidator 默认情况下仅采用当前(正在检查的)实体的存储库。换句话说,如果您提交合作伙伴,它只会检查合作伙伴条目。它不考虑其他实体,例如“single_table”继承映射中的“Buyer”或“User”。

要解决您的问题,您只需在注释 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")

这部分entityClass="Antho\Test\CoreBundle\Entity\User"实际上解决了您的问题。

在这种情况下,验证器将遍历您的所有用户条目(也包括其子条目)。

关于validation - Symfony2 UniqueEntity 实体继承验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9196153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com