2012-08-17 11 views
7

私は自分のアプリケーションでは、次のエンティティクラスを持っている:Symfony2 @UniqueEntity制約がまったく機能しないのはなぜですか?

<?php 

namespace ...; 

// use ... 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;; 
// ... 

/** 
* @ORM\Table(name="sc_user") 
* @ORM\Entity(repositoryClass="...\UserRepository") 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity(fields={"email", "username"}) 
*/ 
class User implements UserInterface, \Serializable, EquatableInterface 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

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

    // ... 
} 

@UniqueEntity制約が無視されています。

@UniqueEntity(fields={"email", "username"}) 

@UniqueEntity(fields={"email"}) 
@UniqueEntity(fields={"username"}) 

と、ここではSymfony2のドキュメントごとに:私はhttp://symfony.com/doc/current/reference/constraints/UniqueEntity.html

@UniqueEntity("email") 
@UniqueEntity("username") 

何も、作品私は、以下を含むさまざまな味を試してみました。整合性制約違反:1062重複したエントリ 「[email protected]」キーのための「UNIQ_D8183973E7927C74」

[23000]

SQLSTATE:代わりに、期待通りにフォームの検証エラーを取得し、私は次の例外を取得しています

これは間違っています!誰もこの問題を解決する方法を知っていますか?登録グループが欠落していた

@UniqueEntity(fields={"email"}, groups={"registration"}) 
@UniqueEntity(fields={"username"}, groups={"registration"}) 

、と私は2つにそれらを分離するために必要な:

答えて

20

framework: 
    validation: 
     enable_annotations: true 

を追加しよう別々の注釈。

+0

+1感謝を!それは治療を働いた! – coder4show

+2

こんにちはJosefさん、以前の質問のようですが、あなたと同じ問題を抱えています。ちょっと疑問に思っています。私は電子メールと携帯電話だけであなたがしたのと全く同じユニークなエンティティフィールドを追加しましたが、それでも検証エラーの代わりに私に例外を与えています。何か案は? – iLikeBreakfast

+1

@iLikeBreakfastあなたの 'FormType'の' setDefaultOptions'メソッドで検証グループを宣言する必要があります – ferdynator

1

は問題は次のように解決したアプリの設定に

11

フォームコレクションを使用し、関連するエンティティを処理するサブフォームを含める場合は、ルートとすべてのサブフォームでcascade_validationtrueに設定する必要があります。

Symfony documentationにヒントを参照してください:

カテゴリタイプの検証を有効にするには、TaskTypecascade_validationオプションを追加します。

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Acme\TaskBundle\Entity\Task', 
     'cascade_validation' => true, 
    )); 
} 

更新:

ことを確保するためにあなたの子エンティティはより良い方法が存在することが確認されています。 Symfonyはまさにこの理由のためにValidの制約を提供します。 documentationから:

有効
この制約は、検証されているオブジェクトのプロパティとして埋め込まれているオブジェクトの検証を可能にするために使用されます。これにより、オブジェクトとそれに関連付けられたすべてのサブオブジェクトを検証できます。

+0

これはここでは有用で正しい答えだけです。 – VisioN

3

(nullも可能)PIDで正常に動作する例えばignoreNull

に注意してください。

constraints: 
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
    fields: [page, pid, position] 
    errorPath: page 
    groups: [Menu] 
    message: "Page already exists with that parent" 
    ignoreNull: false 
+0

それは私の問題の答えでした。ありがとう! – nataliastanko

関連する問題