您的位置:首页 > 编程语言 > PHP开发

LotusPhp学习六:Validator 组件的使用

2013-05-07 21:12 369 查看
趁现在炖肉的呢,抽个空赶紧写一篇,每天忙死。

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']);


未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: