2016-06-28 7 views
0

Ich möchte zwei Doctrine-Entitäten für meinen Benutzerregistrierungsprozess verwenden: User und Mailaddress (die ich getrennt halte). Benutzer sollten sich mit ihrem Benutzernamen (aus Tabelle User) oder ihrer E-Mail-Adresse (aus Tabelle Mailaddress) anmelden können.Symfony2-Validierung über verbundene Entitäten

Leider kann ich nicht die @ -Zeichen in Benutzername nicht zuzulassen - was zu folgendem Problem führt: Wenn ein Benutzer 2 mal registriert ...:

  1. mit Benutzername „was auch immer“ und Mail „nicht @ unique.com“
  2. mit username "[email protected]" und Mail "[email protected]"

... ich mit zwei Benutzern am Ende wird das nicht sein kann ich gekennzeichnet durch ihren jeweiligen Benutzernamen oder E-Mail-Adresse. Also brauche ich eine Bestätigung!

Im Moment habe ich 2 Klassen mit (fast vollständige) Validierung.

Klasse User (Referenzen 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; 

    // ... 
} 

Und Klasse 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; 

    // ... 
} 

Alle Validierungen arbeiten, vor allem die Prüfung auf Eindeutigkeit (keine doppelte Benutzernamen und E-Mail-Adresse).

Aber wie kann ich bestätigen, dass

  1. die angegebene E-Mail-Adresse nicht existiert bereits als Benutzername?
  2. der angegebene Benutzername existiert nicht als E-Mail-Adresse?

Antwort

1

Ich denke, Sie eine benutzerdefinierte Einschränkung wollen: https://symfony.com/doc/current/cookbook/validation/custom_constraint.html

Wenn Sie es sind zu definieren, Sie gehen zu müssen, um Datenbank-Anrufe tätigen, so dass Sie es DoctrineManager passieren müssen werde oder eine EntityManager wenn spezifischer (zB Argumente: ['@doctrine'] bei der Definition Ihres Dienstes)

+0

Danke, löste es! Ich hatte Callback-Einschränkungen zuvor überprüft, sie funktionierten eindeutig nicht. Benutzerdefinierte Einschränkungen, die als Dienst mit dem injizierten Entitätsmanager (oder dem injizierten Repository als Dienst) verwendet werden, haben den Zweck erfüllt. – Eddie