Symfony2:验证断言之间的依赖关系

时间:2012-04-03 15:34:34

标签: symfony symfony-forms

我有一个带有字段的经典表单:'username','password'和'birthday'。

以下是我的验证断言(在我的用户实体中):

.....

/**
 * @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);
}

问题在于,当我提交完全为空的表格时:

  • 'username':错误消息,因为它是空白的(确定)
  • 'password':错误消息,因为它是空白的(确定)
  • 'password':错误消息,因为它与用户名相同(这是问题!)

所以,2个问题:

  1. 如何解决这个“显示”问题?
  2. 如何使用{{form_errors(form.password)}}在<密码'字段旁边显示此消息?
  3. 感谢您的帮助: - )

    斯坦

2 个答案:

答案 0 :(得分: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}”,即一个名为类似于定义约束的类的组(在我们的例子中为“User”)。
  3. 验证组“{ClassName}”中的对象时,将验证组“{ClassName}”中的所有约束(即“默认”组中的所有约束)
  4. 验证“默认”组中的对象时,将验证“默认”组中的所有约束,除非:
    • 该类定义了一个组序列。在这种情况下,将按顺序验证组序列中的组。
  5. 因此,组序列不能包含“Default”组(这会创建一个循环),但需要包含“{ClassName}”组。

    答案2:使用“error_mapping”选项(仅限最新的Symfony主机)。

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

答案 1 :(得分: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) }}

根据需要设置样式。