5

ユーザー登録フォームがあります。このフォームで実行する必要があることの1つは、新しいユーザーの電子メールアドレスの一意性を強制することです。つまり、新しいユーザーの電子メールアドレスは、他の誰かがすでに使用している電子メールアドレスであってはなりません。

私はまだこの問題の許容できる解決策を見つけることができませんでした。これは、このニーズがどれほど単純で一般的であるか(そして、Railsでの解決策がどれほど単純で簡単か)を考えると、いくぶん驚くべきことです。

私はこの質問/回答を見てきましたが、その解決策の問題は、レコードの作成だけでなく、レコードを更新しようとするたびに「一意性」を検証しているように見えることです。したがって、レコードが保存されると、電子メールアドレスがすでに使用されていることが示されるため、レコードを再度更新することはできません。(おそらく私は彼らのソリューションを間違って実装していますが、私はそうではないようです。)

エンティティ/フォームの一意性バリデーターの実用的な例(ドキュメントへのリンクだけでなく、私がすでに読んだものをお願いします)を持っている人はいますか?

4

3 に答える 3

19

さて、私はそれを機能させています。メールの一意性がすべてのユーザーフォームで「検証」されるという問題は、そこでチェックするかどうかに関係なく、検証グループで解決できました。これが私のUserエンティティの関連部分です。注釈のgroups={"registration"}一部に注意してください。@UniqueEntity

/**
 * VNN\PressboxBundle\Entity\User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 * @UniqueEntity(fields="email", message="Sorry, this email address is already in use.", groups={"registration"})
 * @UniqueEntity(fields="username", message="Sorry, this username is already taken.", groups={"registration"})
 */
class User implements AdvancedUserInterface, \Serializable
{
    /** 
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /** 
     * @var string $email
     * @Assert\NotBlank()
     * @Assert\Email()
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     */
    private $email;

    /**
     * @var string $username
     * @Assert\NotBlank()
     *
     * @ORM\Column(name="username", type="string", length=255, unique=true)
     */
    private $username;

そして私のフォームクラス(最後の関数に注意してください):

<?php

namespace VNN\PressboxBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class UserType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {   
        $builder
            ->add('first_name')
            ->add('last_name')
            ->add('email')
            ->add('username')
            ->add('password', 'password')
            ->add('athletic_director_email')
            ->add('school')
            ->add('active', 'hidden')
            ->add('transition_key', 'hidden')
        ;   
    }   

    public function getName()
    {   
        return 'vnn_pressboxbundle_usertype';
    }   

    // The following function is what's important here.
    // This tells this form to use the "registration" validation group.
    public function getDefaultOptions(array $options)
    {   
        return array(
            'validation_groups' => array('registration')
        );  
    }   
}

そして、私はそれだけだと信じています。他の場所で特別なことをする必要はなかったと思います。

于 2012-06-05T15:33:10.870 に答える
0

あなたはそれをハードコーディングすることができます

$form->handleRequest($request);

if ($form->isSubmitted()) {
    if ($existingUser = $this->getDoctrine()->getRepository('AppBundle:User')->findOneBy(['email' => trim($form->getData()->getEmail())])) {
          $form->get('email')->addError(new FormError('Email already used'));
     }
}
于 2018-04-02T17:52:15.060 に答える
-1

Doctrineを使用している場合、エンティティに一意のフラグを直接設定することはできますか?

/**
 * @ORM\Column(type="string", unique="true")
 */
protected $email;
于 2012-06-04T15:34:47.660 に答える