我想在我的用户注册过程中使用两个Doctrine实体:User
和Mailaddress
(我保持分开)。用户应该能够使用他们的用户名(来自表格User
)或他们的电子邮件地址(来自表格Mailaddress
)进行登录。
不幸的是,我不能禁止@登录用户名 - 这会导致以下问题: 如果用户注册了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;
// ...
}
所有验证都有效,主要是检查唯一性(没有重复的用户名和电子邮件地址)。
但我怎样才能验证
答案 0 :(得分:1)
我认为你想要一个自定义约束: https://symfony.com/doc/current/cookbook/validation/custom_constraint.html
当你定义它时,你将不得不进行数据库调用,因此如果更具体(例如参数:['@ doctrine']定义你的服务,你将不得不传递DoctrineManager或EntityManager) )