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

Aur*_*rel 1 symfony-forms symfony

我有一个带有字段的经典表单:'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);
}
Run Code Online (Sandbox Code Playgroud)

问题是当我提交表格时它完全是空的:

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

那么,2个问题:

  1. 如何解决这个'显示'问题?
  2. 如何使用{{form_errors(form.password)}}在"密码"字段旁边显示此消息?

谢谢你的帮助 :-)

斯坦

Ber*_*sek 6

答案1:使用a GroupSequence.

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

这将首先验证"User"组中的所有约束.只有当该组中的所有约束都有效时,才会验证第二个组"Strict",我添加了您的自定义验证方法.

为了解释,为什么"用户"包含所有其他约束,我需要详细说明:

  1. 没有显式groups集的每个约束都属于"默认"组
  2. 属于"默认"组的每个约束也属于组"{ClassName}",即一个名为类似于定义约束的类的组(在我们的例子中为"User").
  3. 验证组"{ClassName}"中的对象时,将验证组"{ClassName}"中的所有约束(即组"默认"中的所有约束)
  4. 验证"默认"组中的对象时,将验证"默认"组中的所有约束,除非:
    • 该类定义了一个组序列.在这种情况下,将按顺序验证组序列中的组.

因此,组序列不能包含"默认"组(这将创建一个循环),但需要包含组"{ClassName}".

答案2:使用"error_mapping"选项(仅限最新的Symfony主机).

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