谨慎:您正在浏览遗产ob娱乐下载symfony 1.倍本网站的一部分。
如何实现一个条件验证器?
语言
经典的登录表单由两个字段组成:用户名和密码。
验证规则非常简单:
- 他希望每个领域都是必修课
- 他想检查密码是否正确
下面是登录表单的第一个实现:
类loginForm扩展sfForm{公共函数配置(){这个美元->setWidgets(数组(“用户名”=>新sfWidgetFormInput(),“密码”=>新sfWidgetFormInputPassword(),));这个美元->setValidators(数组(“用户名”=>新sfValidatorString(数组(“要求”=>真正的)),“密码”=>新sfValidatorString(数组(“要求”=>真正的)),));这个美元->widgetSchema->setNameFormat(“登录(% s)”);}}
此表单强制要求用户名和密码字段,但不检查密码的正确性。
只有当您也有权访问username值时,才能验证密码。但是您可能知道,附加到字段的验证器不能访问表单的其他值。
当一个验证器依赖于另一个提交的值时,您需要创建一个后验证器.后验证器在所有其他验证器之后执行,并得到整个清理后的值数组。
为了检查密码,我们将实现一个简单的回调验证器,以确保提交的密码与用户名相等。当然,对于他的实际项目,您将不得不调用模型层来完成实际工作。
下面是添加了post验证器的修改后的登录表单:
类loginForm扩展sfForm{公共函数配置(){这个美元->setWidgets(数组(“用户名”=>新sfWidgetFormInput(),“密码”=>新sfWidgetFormInputPassword(),));这个美元->setValidators(数组(“用户名”=>新sfValidatorString(数组(“要求”=>真正的)),“密码”=>新sfValidatorString(数组(“要求”=>真正的)),));这个美元->widgetSchema->setNameFormat(“登录(% s)”);//添加一个post validator这个美元->validatorSchema->setPostValidator(新sfValidatorCallback(数组(“回调”=>数组(这个美元,“checkPassword”))));}公共函数checkPassword(美元的验证器,美元的价值){如果(美元的价值[“密码”]! =美元的价值[“用户名”]){//密码不正确,抛出错误扔新sfValidatorError(美元的验证器,“无效的密码”);}//密码正确,返回干净的值返回美元的价值;}}
现在,表单按预期工作,但是仍然存在一个小问题:如果您提交了一个随机密码而没有输入用户名,那么您将看到两个错误消息:用户名的必需错误和密码错误的全局错误。
但是等一下,如果用户名是空的,我们不需要验证密码。让我们将表单更改为仅在提交用户名时验证密码。这很简单,因为我们只需要确保美元价值(“用户”)
在post验证器回调中不为空:
公共函数checkPassword(美元的验证器,美元的价值){//在验证密码之前,请检查用户名是否为空如果(!空(美元的价值[“用户名”])& &美元的价值[“密码”]! =美元的价值[“用户名”]){扔新sfValidatorError(美元的验证器,“无效的密码”);}返回美元的价值;}
我们宁愿在密码字段上方出现“无效密码”错误消息,而不是全局错误。
方法所绑定的错误很容易实现密码
字段,而不是抛出全局错误:
公共函数checkPassword(美元的验证器,美元的价值){如果(!空(美元的价值[“用户名”])& &美元的价值[“密码”]! =美元的价值[“用户名”]){美元的错误=新sfValidatorError(美元的验证器,“无效的密码”);//抛出绑定到密码字段的错误扔新sfValidatorErrorSchema(美元的验证器,数组(“密码”=>美元的错误));}返回美元的价值;}
本作品采用创作共用署名-非商业性-禁止派生作品3.0未移植许可协议授权。