2012-04-03 7 views
1

私は古典的なフォームに 'username'、 'password'、 'birthday'というフィールドがあります。Symfony2:検証アサート間の依存性

..... 

/** 
* @var string 
* @Assert\NotBlank(message="username.error.blank") 
* @Assert\MinLength(limit="2", message="username.error.short") 
*/ 
protected $username; 

/** 
* @var string 
* @Assert\NotBlank(message="password.error.blank") 
* @Assert\MinLength(limit="4", message="password.error.short") 
*/ 
protected $password; 

/** 
* @Assert\True(message="password.error.different") 
*/ 
public function isPasswordLegal() 
{ 
    return ($this->username != $this->password); 
} 

問題は、私がフォームを送信するとき、それは完全に空になったときということです::

  • 「ユーザー名」:エラーここで

    は私の(私のUserエンティティで)検証のためにアサートされています(ok)

  • 'パスワード':空白(ok)のためエラーメッセージ
  • 'パスワード':ユーザー名と同じであるため、エラーメッセージが表示されますoblem)

をので、2つの質問:!

  1. をこの '表示' の問題を解決する方法は?
  2. {{form_errors(form.password)}}で 'パスワード'フィールドの隣にこのメッセージを表示するにはどうすればよいですか?あなたの助けのための

おかげ

オーレル

答えて

1

A1 :-)。私は少し冗長かもしれないが、これは十分に簡単です:

public function isPasswordLegal() 
{ 
    // This is okay because the isBlank assert will fail 
    if (!$this->password) return true; 

    return ($this->username != $this->password); 
} 

A2。限り、次のようなものが表示されます:

{{ form_label (form.username) }}{{ form_widget(form.username) }}{{ form_errors(form.username) }} 

{{ form_label (form.password) }}{{ form_widget(form.password) }}{{ form_errors(form.password) }} 

必要に応じてスタイル。

+0

ほぼ完璧です。 A1はOkですが、A2はパスワードフィールドに近いメソッド "isPasswordLegal"に関連するエラーメッセージを表示しません... – Aurel

6

回答1:GroupSequenceを使用してください。

/** 
* @Assert\GroupSequence({"User", "Strict"}) 
*/ 
class User 
{ 
    /** 
    * @Assert\True(message="password.error.different", groups="Strict") 
    */ 
    public function isPasswordLegal() 
    { 
     return ($this->username != $this->password); 
    } 

これは、グループ "User"のすべての制約を最初に検証します。そのグループのすべての制約が有効な場合のみ、2番目のグループ「Strict」が検証され、カスタム検証メソッドが追加されます。

は、「ユーザー」は、他のすべての制約が含まれている理由を、説明するために、私はもう少し詳しく説明する必要があります。

    明示的 groupsセットを持っていない各制約は、グループ「デフォルト」
  1. 各制約に属し
  2. ことグループ "Default"はグループ "{ClassName}"に属します。つまり、制約が定義されているクラス(この場合は "User")と同じ名前のグループです。
  3. グループ「{ClassName}」のオブジェクトを検証すると、グループ「{ClassName}」のすべての制約が検証されます(グループ「Default」のすべての制約)
  4. グループ "Default"グループ "Default"のすべての制約が検証されます。無限;
    • クラスはグループシーケンスを定義します。その場合、グループシーケンス内のグループは順番に検証されます。

したがって、グループ配列は、代わりに「{}クラス名を」グループ「デフォルト」(これはサイクルを作成します)が含まれ、しかし基を含有する必要はないことができます。

回答2: "error_mapping"オプションを使用してください(最新のSymfonyマスターの場合のみ)。

class UserType 
{ 
    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => '...\User', 
      'error_mapping' => array(
       'passwordLegal' => 'password', 
      ), 
     ); 
    } 
} 
関連する問題