2012-04-03 35 views
1

我有一個帶有字段的'經典形式':'用戶名','密碼'和'生日'。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); 
} 

的問題是,當我提交表單時,它完全是空的:

  • 「用戶名」:錯誤因爲它是空的(ok)
  • 'password':錯誤信息是因爲它是空的(ok) oblem)

所以,2個問題:

  1. 如何解決這個 '顯示' 的問題?
  2. 如何使用{{form_errors(form.password)}}在'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正常,但A2不會顯示與密碼字段旁邊的方法「isPasswordLegal」相關的錯誤消息... – Aurel 2012-04-11 07:44:10

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」中的所有約束條件。只有該組中的所有約束都是有效的,第二組「Strict」纔會被驗證,我添加了您的自定義驗證方法。

要解釋一下,爲什麼「用戶」包含所有其他的限制,我需要更詳細地說明一點:

  1. 每一個沒有明確groups集約束屬於組「默認」
  2. 每個約束屬於「默認」組也屬於組「{ClassName}」,即一個名稱類似於約束被定義的類的組(在我們的例子中爲「用戶」)。
  3. 當您驗證組的對象「{類名}」,在組中的所有約束「{類名}」被驗證(即,在組「默認」的所有約束)
  4. 當您驗證在組「默認」的對象,組「默認」中的所有約束條件都被驗證,除非:
    • 該類定義了組序列。在這種情況下,組序列中的組將按順序進行驗證。

因此,組的序列不能包含組「默認」(這將創建一個循環),但需要包含羣組「{}類名」代替。

回答2:使用「error_mapping」選項(僅限於最新的Symfony主站)。

class UserType 
{ 
    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => '...\User', 
      'error_mapping' => array(
       'passwordLegal' => 'password', 
      ), 
     ); 
    } 
}