跨相关实体的Symfony2验证

时间:2016-06-28 19:21:43

标签: validation symfony doctrine-orm

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

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

  1. 使用用户名"无论"和 mail" not@unique.com"
  2. 使用用户名" not@unique.com" 并邮寄" what@ever.com"
  3. ...我最终会有两个用户无法通过各自的用户名或电子邮件地址识别出来。所以我需要一些验证!

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

    班级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. 指定的用户名不作为电子邮件地址存在?

1 个答案:

答案 0 :(得分:1)

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

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