专家:如何实现一个条件验证器吗?
2008年9月5日·发表的法比安效力
Jon symfony 1.1ob娱乐下载工作项目与一个典型的登录表单。
形式是由两个字段:用户名和密码。验证规则很简单:
- 他希望每个字段是必需的
- 他想检查密码的正确性
这是第一个实现登录表单:
类loginForm扩展sfForm{公共函数配置(){这个美元- >setWidgets(数组(“用户名”= >新sfWidgetFormInput(),“密码”= >新sfWidgetFormInputPassword(),));这个美元- >setValidators(数组(“用户名”= >新sfValidatorString(数组(“要求”= >真正的)),“密码”= >新sfValidatorString(数组(“要求”= >真正的)),));这个美元- >widgetSchema- >setNameFormat(“登录(% s)”);}}
这种形式强制要求用户名和密码字段,但不检查密码的正确性。
密码只能验证如果您还可以访问用户名的值。但是正如你所知道,验证器附加到一个字段没有访问表单的其他值。
当一个验证器依赖于另一个提交的值,您需要创建一个验证器。文章给出了验证器毕竟是执行其他验证器和清理的整个数组值。
检查密码,我们将实现一个简单的回调确认器,以确保提交的密码等于用户名。当然,对于他的真实项目,乔恩会调用模型层做实际的工作。
这是修改后的登录表单添加后验证器:
类loginForm扩展sfForm{公共函数配置(){这个美元- >setWidgets(数组(“用户名”= >新sfWidgetFormInput(),“密码”= >新sfWidgetFormInputPassword(),));这个美元- >setValidators(数组(“用户名”= >新sfValidatorString(数组(“要求”= >真正的)),“密码”= >新sfValidatorString(数组(“要求”= >真正的)),));这个美元- >widgetSchema- >setNameFormat(“登录(% s)”);/ /添加一个验证器这个美元- >validatorSchema- >setPostValidator(新sfValidatorCallback(数组(“回调”= >数组(这个美元,“checkPassword”))));}公共函数checkPassword(美元的验证器,美元的价值){如果(美元的价值(“密码”]! =美元的价值(“用户名”]){/ /密码是不正确的,抛出一个错误扔新sfValidatorError(美元的验证器,“无效的密码”);}/ /密码是正确的,返回清洁值返回美元的价值;}}
现在,形式是预期,但乔不喜欢一件小事:如果你提交一个随机密码没有输入一个用户名,你将有两个错误消息:要求错误用户名和一个全球错误的错误的密码。
但是等一下,如果用户名是空的,我们不需要验证密码。让我们改变的形式只验证密码是否有提交的用户名。这非常简单,我们只需要确保美元价值(“用户”)
不是空的验证器回调:
公共函数checkPassword(美元的验证器,美元的价值){/ /验证密码之前,检查用户名不是空的如果(!空(美元的价值(“用户名”])& &美元的价值(“密码”]! =美元的价值(“用户名”]){扔新sfValidatorError(美元的验证器,“无效的密码”);}返回美元的价值;}
乔恩很挑剔,他宁愿上方的“无效密码”错误消息密码字段而不是全局错误。
这是很容易完成,把绑定到一个错误密码
场,而不是扔一个全球错误:
公共函数checkPassword(美元的验证器,美元的价值){如果(!空(美元的价值(“用户名”])& &美元的价值(“密码”]! =美元的价值(“用户名”]){美元的错误=新sfValidatorError(美元的验证器,“无效的密码”);/ /抛出一个错误绑定到密码字段扔新sfValidatorErrorSchema(美元的验证器,数组(“密码”= >美元的错误));}返回美元的价值;}
Jon现在满意自己的登录表单,他准备接受下一个挑战。
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
在阅读这篇文章之后,看到我要找一些时间的灵活性使移动。
一件事,为什么postValidator称如果验证失败了?
因为!空(美元值(“用户”)与第一验证规则冗余,还是我错过了一些用例?
我期待了解更多的专家!
注:我把这篇文章翻译成日语在我的博客。
我将使用这个来结束我的第一个项目1.1,希望这个周末,所以我们可以在1.1发布文档页面。
你应该使这个基本的东西更简单。
无论如何感谢这个伟大的框架! !
只是想知道哪一个是最好的方法?
@Asif阿里穆罕默德-错误绑定到密码字段,但这并不是说用户名是正确的。它所做的是承认非空的用户名和密码,用户(或饼干)知道了。