Symfony - 在两个字段中具有唯一值的实体

时间:2018-04-24 07:03:03

标签: symfony doctrine

在我的用户实体中,我有两个字段(用户名和电子邮件) 我希望它们是相互独特的。我将Annotation«UniqueEntity»放在我的实体类的顶部,并在每个字段上添加一个唯一的属性,如下所示:

/**
* Class User
* @package App\Entity
* @ORM\Table(name="user", uniqueConstraints={
* @ORM\UniqueConstraint(name="app_user_email", columns="email"),
* @ORM\UniqueConstraint(name="app_user_username", columns="username")
* })
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(fields={"email"})
* @UniqueEntity(fields={"username"})
*/
class User implements UserInterface, \Serializable
{
....

/**
 * @var string
 *
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\NotBlank
 */
private $username;

/**
 * @var string
 *
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\Email
 * @Assert\NotBlank
 * @Assert\Length(max=255, maxMessage="...")
 */
private $email;


....
}

在我的数据库中,我不能拥有2个相同的电子邮件或用户名。这是一个有效的观点。我还想要在其他两个字段之一中找不到两个字段之一的值。

例如,如果User表中的条目具有特定的电子邮件值,我不希望能够在其他用户的username字段中输入相同的值。

最好的方法是什么?

所有这一切的目的是让用户能够使用他的用户名或电子邮件进行身份验证,如果用户的邮件等于另一个用户的用户名,则会导致问题。

1 个答案:

答案 0 :(得分:0)

Hy,在您的实体中,您可以添加回调约束

首先添加

use Symfony\Component\Validator\Context\ExecutionContextInterface;

并在您的课程中添加

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context, $payload)
{
    if ($this->username == $this->email) {
        $context->buildViolation('The username can\'t be the email')
            ->atPath('username')
            ->addViolation();
    }
}

检查https://symfony.com/doc/current/reference/constraints/Callback.html您的symfony版本