我有一个带有字段的经典表单:'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);
}
问题在于,当我提交完全为空的表格时:
所以,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”,我添加了您的自定义验证方法。
为了解释为什么“用户”包含所有其他约束,我需要详细说明:
groups
集的每个约束属于“默认”组因此,组序列不能包含“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) }}
根据需要设置样式。