ユーザー登録処理に2つのDoctrineエンティティ(User
とMailaddress
)を使用したいと思います。ユーザーは、ユーザー名(表User
)またはメールアドレス(表Mailaddress
)を使用してログインできる必要があります。 ... をユーザーが2回登録した場合:「何でも」とメール「ではないユーザ名と関連するエンティティ間でのsymfony2の認証
- 次のような問題につながる -
残念ながら、私は、ユーザ名に@記号を禁止することはできません@ unique.com
[email protected] "とメール "[email protected]"」ユーザ名と
今、私は(ほぼ完全な)検証を持つ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;
// ...
}
すべての検証は、一意性のために主にチェック(無重複したユーザ名とメールアドレスを)働いています。
しかし、どのように私は
- 指定したメールアドレスがすでにユーザー名として存在していないことを検証することができますか?
- 指定されたユーザー名はメールアドレスとして存在しません。あなたはそれを定義している場合は https://symfony.com/doc/current/cookbook/validation/custom_constraint.html
あなたはそれDoctrineManagerまたはEntityManagerを渡す必要がありますので、あなたは、データベースの呼び出しを行うために必要があるとしている:
Thanx、解決済み!以前はコールバックの制約をチェックしていましたが、明らかに動作しませんでした。注入されたエンティティマネージャ(またはサービスとして注入されたリポジトリ)でサービスとして使用されるカスタム制約は、このトリックを行いました。 – Eddie