跨相关实体的Symfony2验证

问题描述 投票:0回答:1

我想在我的用户注册过程中使用两个Doctrine实体:UserMailaddress(我保持分开)。用户应该能够使用他们的用户名(来自表User)或他们的电子邮件地址(来自表Mailaddress)登录。

不幸的是我无法禁止@登录用户名 - 这会导致以下问题:如果用户注册了2次......:

  1. 用户名“whatever”和邮件“[email protected]
  2. 用户名“[email protected]”,邮件“[email protected]

...我最终会有两个用户无法通过各自的用户名或电子邮件地址识别出来。所以我需要一些验证!

现在我有2个类(几乎完成)验证。

User(参考Mailaddress):

<?php

//...
use AppBundle\Entity\Mailaddress;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="unique_username", columns={"username"}), @ORM\UniqueConstraint(name="user2mail", columns={"fk_mail"})})
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\UserRepository")
 * @UniqueEntity(
 *   fields={"username"})
 */
class User
{
    /**
     * @Assert\NotBlank(...)
     * @Assert\Length(...)
     * @Assert\Regex(...)
     *
     * @ORM\Column(name="username", type="string", length=100, nullable=false, unique=true)
     */
    private $username;

    //...

    /**
     * @var Mailaddress
     *
     * @Assert\Valid()
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Mailaddress", cascade={"persist"})
     * @ORM\JoinColumn(name="fk_mail", referencedColumnName="id", nullable=false)
     */
    private $obj_mail;

    // ...
}

和班级Mailaddress

<?php

//...
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Table(name="mailaddress", uniqueConstraints={@ORM\UniqueConstraint(name="uniqueEmail", columns={"email"})})
 * @ORM\Entity
 * @UniqueEntity(
 *     fields={"email"})
 */
class Mailaddress
{
    /**
     * @Assert\NotBlank(...)
     * @Assert\Email(...)
     * @Assert\Length(...)
     *
     * @ORM\Column(name="email", type="string", length=100, nullable=false, unique=true)
     */
    private $email;

    // ...
}

所有验证都有效,主要是检查唯一性(没有重复的用户名和电子邮件地址)。

但是我该如何验证呢

  1. 给定的电子邮件地址作为用户名还不存在?
  2. 给定的用户名不作为电子邮件地址存在?
validation symfony doctrine-orm
1个回答
1
投票

我想你想要一个自定义约束:https://symfony.com/doc/current/cookbook/validation/custom_constraint.html

当你定义它时,你将不得不进行数据库调用,所以如果更具体的话,你必须传递DoctrineManager或EntityManager(例如:在定义你的服务时参数:['@ doctrine'])

© www.soinside.com 2019 - 2024. All rights reserved.