- 支持对上传的文件进行校验(比如文件类型,文件大小区间)
- 准确校验PHP的各种数据类型、以及常见字符串的数据类型(比如字母、数字、邮箱、中国地区的手机号、IP地址和URL等)
- 支持多个参数之间的关联性校验(比如当参数a传入时,参数b也必须传入)
- 准确判断数值的大小和长度,以及它们的区间(比如,校验年龄在18岁到59岁之间,字符串长度在12到20个之间)
- 支持浮点类型的准确校验,并且支持精度转换(比如将money字段转成2为小数,同时会校验原参数是否是浮点数)
- 高级用法:支持字符串形式的一维数组校验,比如字符串"[1,2,3,4]"的校验,同时支持将其转成PHP数组,数组中的元素也可以指定数据类型
- 支持自定义提示文案,语言文件默认路径使用Laravel5.2的项目结构,放于 resources/lang/下。如有特殊需求也可以配置
use FangStarNet\PHPValidator\Validator;
$data = $_GET;
Validator::make($data, [
"id" => "present|alpha_num|length:32",
],[
"id.length" => "id不合法",
]);
if (Validator::has_fails()) {
echo Validator::error_msg();
} else {
echo "参数校验已经通过";
}
代码解析:
#1 引用组件 FangStarNet\PHPValidator\Validator
#3 请求参数(数组格式)
#5 make()方法:制定校验规则,并且开始处理
- make方法传入3个参数,第一个参数是被校验的数组
- 第二个参数是校验规则
- 具体的校验规则,该文档后续会详细展示
- 第三个参数是个性化文案
- id.length表示针对字段id的length规则,如果校验不通过,文案采用用户制定的"id不合法"
#10 has_fails()方法:判断参数校验是否存在错误(即参数校验是否未通过),true表示未通过,false表示通过
#11 error_msg()方法:显示当然规则的提示文档(仅在校验未通过时使用)
1.文件属性校验:
file_exists、file_type_in、file_max、file_min、file_size_between
2.必传字段校验:
present
3.字段关联性校验:
required_with、required_with_all、required_without、required_without_all、same、different
1.常用字符组合校验:
alpha、num、alpha_num、alpha_dish、var、ip、url、email、mobile、json
2.时间格式校验:
timestamp、date_format
3.正则表达式
regex
4.变量类型校验
string、boolean、integer、float、array、object、object_of
5.字符串形式的变量类型校验
integer_str、float_str、numeric_str、array_str
6.大小和长度范围校验:
max、length_max、min、length_min、length、between、length_between、in、not_in
7.非空校验
filled
8.唯一校验
distinct
9.特殊关键字:类型转换、别名
to_type、alias
关于优先级和校验流程的说明:
优先级总的一个原则:第二优先级只针对字段校验,校验第二优先级,必须是基于字段存在的条件下成立的
举个简单的例子:"age" => "min:18"
校验age字段的值最小为18,前提是age字段存在的情况下才去校验的,如果不存在,则跳过校验
文件校验的特殊性:
因为文件属性校验是基于文件存在的条件下成立的,因此,文件校验隐含一个present规则
针对文件属性校验,没有第二校验规则一说
在HTTP请求中,上传的文件参数放于form-data中,类型为file;可以用post-man工具进行测试
字段关联性:
组件提供字段之间关联性校验,举个简单的例子:"a" => "same:b"
参数a和b的值必须一样,如果参数未传入,其值为null
学到这里,你已经明白了组件是怎么去校验参数的,并且学会了怎么去写基本的校验规则!
那么,这一章将总结组件提供的所有校验规则和它们的意义:
未传入/空字符串/空数组:表示不存在,其他情况都认为参数存在
所有字符都是字母 a-z和A-Z
所有字符都是数字 0-9
所有字符都是数字或数字 0-9 a-z A-Z
字符串由字母、数字、下划线和短横线组成 0-9 a-z A-Z _ -
字符串必须是有效的变量名,即字母或下划线开头,并且整个字符串由字符数字和下划线组成
参数必须是有效的IP地址
参数必须是是有效的URL
参数必须是有效的邮箱地址
参数必须是有效的电话号码,中国地区(2016年):1开头,第2为是3-8的数字,后面是9位数字
参数必须是有效的JSON字符串
参数必须是有效的时间戳
参数必须满足指定的日期格式,比如:"dt" => "date_format:Y-m-d H:i:s"
参数必须满足指定的正则表达式,比如:"p" => "regex:Y-m-d H:i:/^abc/"
参数必须是字符串类型
参数必须是布尔类型
参数必须是整数(不区分精度)类型
参数必须是浮点数(不区分精度)类型
参数必须是数组类型
参数必须是对象类型
参数必须是指定的对象类型,比如:"obj" => "object_of:\App\Log"
参数必须是整数形式的字符串
参数必须是小数形式的字符串
参数必须是数字形式的字符串
参数必须是字符串形式的字符串,比如 "[1,2,3]" 这样的字符串
参数的值,最大为指定的值,比如:"p" => "max:18"
参数的长度,最大为指定的值(一个汉字算一个),比如:"p" => "length_max:12" // 表示最长为12个字符
参数的值,最小为指定的值,比如:"p" => "max:0"
参数的长度,最大为指定的值(一个汉字算一个),比如:"p" => "length_min:6" // 表示最短为6个字符
参数的长度,必须是指定的长度(一个汉字算一个),比如:"id" => "length:32" // 表示id字段必须是32个字符
参数的值,必须在指定的区间(区间从小到大),比如:"age" => "between:18,59"
参数的长度,必须在指定的区间(区间从小到大),比如:"pwd" => "length_between:6,16"
参数的值,必须在指定的数据中,比如:"status" => "in:1,3,4"
参数的值,必须不在指定的数据中,比如:"status" => "not_in:2,5"
参数的值不能为空,内部使用empty函数校验,请参考PHP官方文档的empty函数
参数的值必须是数组,并且数组中不存在重复的值
针对参数的值,必须和指定参数的值不一样,比如:"p" => "different:a" // 参数p和a的值必须不一样
针对参数的值,必须和指定参数的值一样,比如:"p" => "same:a" // 参数p和a的值必须一样
当指定参数中,只要存在一个时,该参数也必须存在,比如:"a" => "required_with:b" // 当参数b存在时,参数a也必须存在
当指定的所有参数都存在时,该参数也必须存在,比如:"a" => "required_with_all:b,c" // 当参数b和c都存在时,参数a也必须存在
当指定参数中,只要不存在一个时,该参数必须存在,比如:"a" => "required_without:b" // 当参数b不存在时,参数a必须存在
当指定所有参数都不存在时,该参数必须存在,比如:"a" => "required_without_all:b,c" // 当参数b和c都不存在时,参数a必须存在
校验指定的文件是否存在,比如:"f" => "file_exists"
校验指定的文件类型,比如:"f" => "file_type_in:png" // 文件格式不区分大小写
校验指定的文件大小,不能大于x(MB),比如:"f" => "file_max:0.5" // 最大不能超过0.5MB
校验指定的文件大小,不能小于x(MB),比如:"f" => "file_min:0.1" // 最小不能超过0.1MB
校验指定的文件大小,必须在指定的区间范围,单位(MB),比如:"f" => "file_size_between:0.1,0.5"
以下用法已经超出了单纯的参数校验范畴,但它们和参数校验存在着一定的关系!那就是变量类型转换和变量别名
1.将数据insert到mysql时,常常需要插入整数或浮点数,如果数据库字段类型为int,但是插入的时候使用"123"这样的字符串的话,抱歉PDO异常!
2.一个严格的程序员往往需要明确变量类型,只有明确了变量类型,才能写得一手好代码
基于以上或更多的场景,往往我们希望在参数校验完毕后,转换变量类型,得到我们想要的数组。那么 to_type 就由此而来!
Validator::data() 方法返回处理后的参数数组!
Validator::make($data, [
"money" => "float_str|to_type:scale:2",
]);
if (Validator::has_fails()) {
echo Validator::error_msg();
} else {
var_dump(Validator::data());
}
首先校验money字段是否为小数形式,校验通过后,var_dump()打印出来的money字段类型为float,并且四舍五入,保留两位小数
to_type支持的转换类型有:
string、boolean、integer、float、array、object、str_array、scale
其中,string、boolean、integer、float的使用xxxval方法转换,比如:intval($v);
array和object使用强制转换,比如:(array) $v;
比较特殊的是 str_array、scale 的转换
首先校验是否为array_str形式的字符串
是的话,将其解开,转成 [0 => 1, 1 => 2, 2 => 3]的array类型
首先校验参数是否为小数形式
是的话,将其用四舍五入的方法,保留指定的有效小数,最终是float类型
If you discover any security related issues, please email [email protected] instead of using the issue tracker.