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 ...:
- mit Benutzername „was auch immer“ und Mail „nicht @ unique.com“
- 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
- die angegebene E-Mail-Adresse nicht existiert bereits als Benutzername?
- der angegebene Benutzername existiert nicht als E-Mail-Adresse?
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