2016-06-28 8 views
0

ユーザー登録処理に2つのDoctrineエンティティ(UserMailaddress)を使用したいと思います。ユーザーは、ユーザー名(表User)またはメールアドレス(表Mailaddress)を使用してログインできる必要があります。 ... をユーザーが2回登録した場合:「何でも」とメール「ではないユーザ名と関連するエンティティ間でのsymfony2の認証

  1. 次のような問題につながる -

    残念ながら、私は、ユーザ名に@記号を禁止することはできません@ unique.com

[email protected] "とメール "[email protected]"」ユーザ名と

  • " ...私はすることはできません2つのユーザとなってしまいます私もはやそれぞれのユーザ名または電子メールアドレスによって肯定される。だから私はいくつかの検証が必要です!

    今、私は(ほぼ完全な)検証を持つ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. 指定されたユーザー名はメールアドレスとして存在しません。あなたはそれを定義している場合は https://symfony.com/doc/current/cookbook/validation/custom_constraint.html

      あなたはそれDoctrineManagerまたはEntityManagerを渡す必要がありますので、あなたは、データベースの呼び出しを行うために必要があるとしている:

  • 答えて

    1

    は、私はあなたがカスタム制約をしたいと思いますより具体的な場合(例:引数:['@doctrine']でサービスを定義する場合)

    +0

    Thanx、解決済み!以前はコールバックの制約をチェックしていましたが、明らかに動作しませんでした。注入されたエンティティマネージャ(またはサービスとして注入されたリポジトリ)でサービスとして使用されるカスタム制約は、このトリックを行いました。 – Eddie

    関連する問題