Symfony2:验证断言之间的依赖关系
问题描述:
我有一个带有字段的'经典形式':'用户名','密码'和'生日'。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个问题:
- 如何解决这个 '显示' 的问题?
- 如何使用{{form_errors(form.password)}}在'password'字段旁显示此消息?
感谢您的帮助:-)
斯坦
答
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) }}
风格。
答
答案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”才会被验证,我添加了您的自定义验证方法。
要解释一下,为什么“用户”包含所有其他的限制,我需要更详细地说明一点:
- 每一个没有明确
groups
集约束属于组“默认” - 每个约束属于“默认”组也属于组“{ClassName}”,即一个名称类似于约束被定义的类的组(在我们的例子中为“用户”)。
- 当您验证组的对象“{类名}”,在组中的所有约束“{类名}”被验证(即,在组“默认”的所有约束)
- 当您验证在组“默认”的对象,组“默认”中的所有约束条件都被验证,除非:
- 该类定义了组序列。在这种情况下,组序列中的组将按顺序进行验证。
因此,组的序列不能包含组“默认”(这将创建一个循环),但需要包含群组“{}类名”代替。
回答2:使用“error_mapping”选项(仅限于最新的Symfony主站)。
class UserType
{
public function getDefaultOptions()
{
return array(
'data_class' => '...\User',
'error_mapping' => array(
'passwordLegal' => 'password',
),
);
}
}
几乎完美。 A1正常,但A2不会显示与密码字段旁边的方法“isPasswordLegal”相关的错误消息... – Aurel 2012-04-11 07:44:10