2012-04-03 75 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', 
      ), 
     ); 
    } 
}