数据验证
数据验证做为开发中不可缺少的一环。在cmlphp中也提供了简单易用的数据验证工具。
用法
v2.6.8以下版本
<?php
use Cml\Vendor\Validate;
if (Validate::isUrl($description)) {
}
if (Validate::isIp($ip)) {
}
//更多方法参考 http://api.cmlphp.com/Cml/Vendor/Validate.html
v2.6.8+
在v2.6.8版本中对Validate做了增强,除了以上的直接调用方法外,还可以有以下用法:
<?php
use Cml\Vendor\Validate;
//初始化实例 传入包含要验证数据的数组 这边是$_POST
$v = new Validate($_POST);
//type、ptime、status、action 必传
$v->rule('require', ['type', 'ptime', 'status', 'action']);
//type、ptime、status 必须为整形
$v->rule('int', ['type', 'ptime', 'status']);
//ptime只能在0-23范围内
$v->rule('in', ['ptime'], range(0, 23));
//设置字段->实际显示字段的映射关系
$v->label(array(
'type' => '类型',
'ptime' => '执行时间/间隔时间',
'status' => '状态',
'action' => '操作',
));
//批量校验
if(!$v->validate()) {
$error = $v->getErrors();//获取错误信息
}
上面大概演示了如何使用cmlphp自带的Validate
组件进行批量数据验证。下面列出所有的规则以及如何自定义规则。
内置验证规则
'require' => "不能为空",
'gt' => "必须大于 %s",
'lt' => "必须小于 %s",
'lengthGt' => "长度必须大于 %d",
'lengthLt' => "长度必须小于 %d",
'in' => "无效的值",
'notIn' => "无效的值",
'length' => "字符串长度必须在 %d, %d之间",
'empty' => "必须为空",
'equals' => "必须和 '%s' 一致",
'different' => "必须和 '%s' 不一致",
'arr' => "必须是数组",
'email' => "无效邮箱地址",
'ip' => "无效IP地址",
'number' => "只能是数字",
'int' => "只能是整数",
'bool' => "只能是布尔值",
'card' => "必须是身份证",
'mobile' => "手机号码不正确",
'phone' => "固话格式不正确",
'url' => "无效的URL",
'zip' => "邮政编码不对",
'qq' => "qq号格式不正确",
'english' => "只能包括英文字母(A-za-z)",
'chinese' => "只能为中文"
自定义验证规则
除了以上内置的校验规则外,还可以自定义验证规则,方法如下:
<?php
use Cml\Vendor\Validate;
//添加
Validate::addRule('test', function($value, $params) {
//$value的值就是$_POST['test']的值
//$params是参数数组,就是下面$v->rule...中的[1, 2]
return false;
}, '就是不让你通过检验');
$v = new Validate($_POST);
//使用
$v->rule('test', 1, 2);
...
提示信息
内置的验证规则,提示信息跟随系统的语言设置。当框架的语言包为哪个语言时验证规则也显示哪个语言。语言包存放路径为框架的Vendor\Validate\Lang
目录下。也可以在实例化的时候自定义语言包所在路径
<?php
use Cml\Vendor\Validate;
$v = new Validate($_POST, 'lang_dir');
如果不想用内置的语言包也可以使用 message
自定义提示信息,使用方法如下:
<?php
use Cml\Vendor\Validate;
$v = new Validate($_POST);
$v->rule('require', ['type', 'ptime', 'status', 'action'])
->message('{field} 必须填写!');
//其中{field}为占位符。有设置label时会替换为label,没设置label时会替换为相应的字段名