趁现在炖肉的呢,抽个空赶紧写一篇,每天忙死。
Validator 组件顾名思义就是表单验证组件,负责检验各种表单输入是否符合规则。由2个类组成,一个是LtValidator,是专门负责验证的,LtValidatorDtd 是用来定义各种验证规则和返回提示的
LtValidator 的公共方法除了 init() 初始化的组件外,就一个 validate 方法。
Validator 组件支持10种验证规则:
ban
通常用来验证字符串中不包含指定字符的,例如用户名不能包含xxx
输入只支持正则表达式,需要用//引起来.具体可以参考php手册里的preg_match函数
mask
通常用来验证字符串中包含指定字符的,例如用户名只能以字母数字开头
输入只支持正则表达式,需要用//引起来.具体可以参考php手册里的preg_match函数
equal_to
通常用来验证两个值是否恒等,例如输入的两次密码是否相同
输入可以是数字也可以是字符串
max_length
通常用来验证输入的字符串是否超过了指定长度,例如用户名最多只能8个字母
输入只能是数字
min_length
通常用来验证输入的字符串是否少于指定长度,例如用户名最少4个字母
输入只能是数字
max_value
通常用来验证输入的数值是否大于指定的值,例如年龄最大为99岁
输入只能是数字
min_value
通常用来验证输入的数值是否小于指定的值,例如年龄最小为10岁
输入只能是数字
max_selected
通常用来验证选择的最多个数是否大于指定的值,例如最多只能选3个
输入只能是数字
min_selected
通常用来验证选择的最少个数是否小于指定的值,例如最少只能选1个
输入只能是数字
required
通常用来验证该验证选项是否为必填,例如用户名不能为空
输入只能是布尔类型,默认是false
Validator 支持用配置文件来定义错误信息,如果你没有定义默认的错误信息,那通过 LtValidatorDtd 也可以来定义验证错误信息,好了,说的估计有点晕头转向了,还是看例子比较给力。
先定义配置文件,validator.conf.php
文件内容如下:
<?php $config['validator.error_messages'] = array('ban' => '%s 内容中含有禁用词', 'mask' => '%s 不符合验证规范', 'max_length' => '%s 超出最大字符数 %s', 'min_length' => '%s 小于最小字符数 %s', 'max_value' => '%s 大于最大值 %s', 'min_value' => '%s 小于了最小值 %s', 'max_selected' => '%s 选项过多', 'min_selected' => '%s 选项过少', 'required' => '%s 为空', 'equal_to' => '%s 不等于 %s', );
上面的配置文件你可以根据自己的验证内容进行更改。总之定义10个类型的出错显示语句就行。
定义完了配置文件,就需要了解下 Validator 的验证规则
我给出一个我们验证用户注册的常用例子
$this->dtds['Title']=new LtValidatorDtd("用户名称", array("max_length" => 20,"required" => true));
$this->dtds['Pwd']=new LtValidatorDtd("用户密码", array("max_length" => 20, "required" => true)); $this->dtds['Pwd2']=new LtValidatorDtd("重复用户密码", array("equal_to" =>$_POST['Pwd'],"required" => true)); $this->dtds['Roles']=new LtValidatorDtd("用户角色", array("min_selected" =>1));
上面的语句是在LotusPhp MVC模式下的运行范例,如果不启用 LotusPhp MVC模式 ,那就是下面这样的写法了:
$dtd['username'] = new LtValidatorDtd("用户名",
array("max_length" => 16, "min_length" => 4, "required" => true),
array( "max_length" => "%s最多只能有%s个字符", "min_length" => "%s最少必须有%s个字符", "required" => "%s不能为空" ) );
$dtd['password'] = new LtValidatorDtd("密码", array( "max_length" => 20, "min_length" => 3, "required" => true ), array( "max_length" => "%s最多只能有%s个字符", "min_length" => "%s最少必须有%s个字符", "required" => "%s不能为空" ) );
$dtd['password_confirm'] = new LtValidatorDtd("验证密码", array( "equal_to" => $_POST['password'] ), array( "equal_to" => "两次输入的密码不一致" ) ); $dtd['email'] = new LtValidatorDtd("Email", array( "required" => true, "mask" => "/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/", ), array( "required" => "%s不能为空", "mask" => "%s 格式不正确" ) );
不运行 LotusPhp的 MVC 模式,不是我们讲的重点,稍带提示下。
看过上面的两个定义验证规则的范例,基本上多数人能看出来验证规则的定义方法
$dtd['表单名称'] = new LtValidatorDtd("表单名称表述", array( "验证类别1" => '验证类别的值1', "验证类别2" => '验证类别的值2', ... ), array( "验证类别1" => "出错提示语句1", "验证类别2" => "出错提示语句2", ... ) );
如果定义了配置文件,而且不准备定义出错提示语句,而是用默认的出错提示语句,第二个数据可以为空
$dtd['表单名称'] = new LtValidatorDtd("表单名称表述", array( "验证类别1" => '验证类别的值1', "验证类别2" => '验证类别的值2', ... ));
就相当于这个样子了
如果是在LotusPhp MVC模式下,只需要在 __construct() 或者 afterConstruct() 方法里定义验证规则就可以了,框架会自动验证,如果验证失败,会返回3个选项
// 仿照HTTP状态码来定义程序运行状态 $this->code = 407; // LotusPhp 返回的提示标题 $this->message = "Invalid input"; // 返回的错误数组 $this->data['error_messages'] = $validateResult["error_messages"];
目前 LotusPhp MVC 模式下不会直接回显错误,都需要在模板上来定义。而我是根据返回的 code 来定义使用的模板,如果是407,直接定义模板文件为错误显示文件,然后定义上一页的链接,可以返回重新输入,给大家截个图,是我的项目中自定义的错误视图
没有办法,人太懒了,程序表单验证这里做的挺好,前台还是后台都验证的滴水不漏,懒的改代码了,就用RBAC的错误提示代替下吧,就是给个思路,大家都可以有自己的处理方式。
如果不是用的 Lotusp 的 MVC 模式,那定义完了验证规则后还需要有一步
// 过滤下表单,这一步可以省
$userName = addslashes($_POST['userName']); $password = addslashes($_POST['password']); $passwordConfirm = addslashes($_POST['passwordConfirm']); $email = addslashes($_POST['email']);
// 定义
LtValidator ,因为不加载配置文件,所以init可以不调用
// $result 是返回错误提示的数组,如果有错误,$result自然不为空,全部验证完后,可以根据返回的数组进行格式化回显到显示器上 $validator = new LtValidator; $result = array(); $result['username'] = $validator->validate($userName,$dtd['username']); $result['password'] = $validator->validate($password,$dtd['password']); $result['passwordConfirm'] = $validator->validate($passwordConfirm,$dtd['password_confirm']); $result['email'] = $validator->validate($email,$dtd['email']);
未完待续