2011-09-29 6 views
5

私は、ユーザ名と電子メールアドレスが一意である必要があるいくつかのフィールドを持つフォームを検証しようとしています。私がフォームを提出すると、私はデータベースエラーを取得します。私は他のすべてのために行ったようなバリデータを使用したい - 今私はカスタムゲッターとオブジェクトのisvalidUsername関数を使用しようとしていると私はオブジェクトのエンティティマネージャを使用する場合はこれを行うには最良の方法です。相続人は、私がSymfony 2固有のバリデータ

Frontend\UserBundle\Entity\User: 
     properties: 
      email: 
        - NotBlank: ~ 
        - Email: ~ 
     username: 
      - NotBlank: ~ 
     getters: 
       validUsername: 
        - "True": { message: "Duplicate User detected. Please use a different username." } 
       validEmail: 
        - "True": { message: "Duplicate email detected. Please use a different email." } 

...これまでのところで働いている何がありfosuserbundleでユニークなバリデータで構築されているが、私はそれらを使用する方法を見つけ出すことができませんでした。

答えて

1

まず、FOSUserBundleをお使いになることをおすすめします。非常に柔軟性があり、微妙なバグを修正し、すべてが本当に意図通りに動作するかどうかをテストすることで、あなたが費やす時間を節約することができます。

とにかく、自分で本当にビルドしたいのであれば、少なくとも上記のバンドルに触発することができます。彼らはcustom validatorを定義し、一意性がUserManagervalidateUnique)であることを確認します。さらに、コンストラクタインジェクションを介してUserManagerを提供するには、serviceとして登録する必要があります。それでは、それを通常のclass validatorとして使用してください。

5

私はこれが古い質問であることを知っていますが、私はこれを解決しなければならなかったので、私は私のソリューションを共有すると考えました。あなたは、私がモデル自体に私の検証を定義見ることができるように

<?php 
namespace MyCorp\CorpBundle\Entity; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\Email; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** User - Represent a User object */ 
class User implements AdvancedUserInterface { 

    /** @var integer $id */ 
    private $id; 

    /** @var string $email */ 
    private $email; 

    /** Constructor, Getters, Setters etc... */ 

    /** Set a list of rules to use when validating an instance of this Class 
     @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */ 
    public static function loadValidatorMetadata(ClassMetadata $metadata) { 

     $metadata->addPropertyConstraint('email', new MaxLength(255)); 
     $metadata->addPropertyConstraint('email', new NotBlank()); 
     $metadata->addPropertyConstraint('email', new Email()); 

     $metadata->addConstraint(new UniqueEntity(array(
      "fields" => "email", 
      "message" => "This email address is already in use") 
     )); 

    } 

} 

私はこれが私のマニュアルのアプローチであるように、私のユーザーを処理するために、任意のバンドルを使用しません。 symfonyはloadValidatorMetadataにバリデータを読み込ませます。

+0

おそらく、この場合はFOSUserBundleを使うほうが良いでしょうが、私はちょうどそのものすべてを邪魔することなく、何かに一意のバリデータを打つことを望んでいました。ありがとう。 –

+0

私はこのソリューションの問題点を発見しました。既存のユーザーレコードを更新しようとすると、電子メールアドレスが既に使用されているというエラーが表示されます。 –

+0

この解決策は私のために働いています。編集していますので、何が起こっているのか分かりません。火曜日まで自分のコードをチェックすることはできませんが、何かを見ることができるかどうかを確認します – OrganicPanda

0

ユーザーが特定のプロパティに対して一意の値を提供することを保証するために、妥当性検査の制約があります(UniqueEntity)。

Symfonyがサポートするさまざまなフォーマットを使用した例については、documentationを参照してください。アノテーションを使用した例を次に示します。

// Acme/UserBundle/Entity/Author.php 
namespace Acme\UserBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\Mapping as ORM; 

// DON'T forget this use statement!!! 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Entity 
* @UniqueEntity("email") 
*/ 
class Author 
{ 
    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * @Assert\Email() 
    */ 
    protected $email; 

    // ... 
} 
関連する問題