PHP自定义参数校验工具Validator

原创
小哥 2年前 (2023-05-16) 阅读数 48 #大杂烩

PHP服务端校验客户端请求传递的参数,做参数验证时有许多弊病

  • 不同业务需求而做不同的参数校验
  • 写许多判断条件
  • 许多重复校验逻辑

通过归纳整理,自定义了一个参数校验工具类Validator

使用方法:

/**
 * @var array $params 需要校验参数数组(key=>value)
 * @var array $rules 校验规则(key=>rules)
 * @var array $message 错误信息(key.rule=>message)
 */
$validator = Validator::make($params, $keyRules, $messages)

校验规则:

required :验证参数key的值不能为空。
以下情况参数key的值都为空:

  • 值为null
  • 值是空字符串
  • 值是空数组

    $validator = Validator::make($params, [ name => required ], [ name.required => 姓名不能为空 ]); if ($validator->fail) { throw new Exception($validator->errors[0]); }

required_if:field1,value1,field2,value2,… :如果 field 等于 value (多个field=value的条件只需满足一个),那么验证参数key的值不能为空。

$validator = Validator::make($params, [
    age => required_if:type,1|numeric,//当type=1时年龄不能为空
    //或者
    //age => [required_if:type,1, numeric],
    //或者
    //age => [required_if => type,1, numeric],
    //或者
    //age => [required_if => [type, 1], numeric],
], [
    age.required => 年龄不能为空,
    age.numeric => 年龄应为数字
]);
if ($validator->fail) {
    throw new Exception($validator->errors[0]);
}

required_if_all:field1,value1,field2,value2,... :如果 field 等于 value (多个field=value的条件必须全部满足),那么验证参数key的值不能为空。

required_unless:field1,value1,field2,value2,... :除非 field 等于 value (多个field=value的条件只需满足一个)时,否则验证参数key的值不能为空。

required_unless_all:field1,value1,field2,value2,... :除非 field 等于 value (多个field=value的条件必须全部满足),否则验证参数key的值不能为空。

required_with:filed1,field2,... :如果 field 不为空 (多个 field 不为空的条件只需满足一个),那么验证参数key的值不能为空。

required_with_all:filed1,field2,... :如果 field 不为空 (多个 field 不为空的条件必须全部满足),那么验证参数key的值不能为空。

required_without:filed1,field2,... :如果 field 为空(多个 field 为空的条件只需满足一个),那么验证参数key的值不能为空。

required_without_all:filed1,field2,... :如果 field 为空(多个 field 为空的条件必须全部满足),那么验证参数key的值不能为空。

equal:value : 验证参数key的值必须等于value。

equal_if:val,field1,value1,field2,value2,... :如果 field 等于 value (多个field=value的条件只需满足一个),那么验证参数key的值必须等于val。

equal_if_all:val,field1,value1,field2,value2,... :如果 field 等于 value (多个field=value的条件必须全部满足),那么验证参数key的值必须等于val。

equal_unless:val,field1,value1,field2,value2,... :除非 field 等于 value (多个field=value的条件只需满足一个)时,否则验证参数key的值必须等于val。

equal_unless_all:val,field1,value1,field2,value2,... :除非 field 等于 value (多个field=value的条件必须全部满足),否则验证参数key的值必须等于val。

numeric :验证参数key的值应为数字。

min:value :当验证参数key的值为数字时,其值必须大于等于value;当验证参数key的值非数字时,其值长度必须大于等于value。第二个参数 len 默认为0,当 len =1时,验证参数key的值长度。

$params = [age => 15, member_code => 2345154678];
$validator = Validator::make($params, [
    age => min:18,
    member_code => required|min:12,1
], [
    age.min => 年龄应在18岁以上(包含18岁),
    member_code.required => 会员编号不能为空,
    member_code.min => 会员编号长度应至少12位
]);
if ($validator->fail) {
    throw new Exception($validator->errors[0]);
}

max:value :当验证参数key的值为数字时,其值必须小于等于value;当验证参数key的值非数字时,其值长度必须小于等于value。第二个参数 len 默认为0,当 len =1时,验证参数key的值长度。

regex:pattern :验证参数key必须满足正则表达式pattern。

$validator = Validator::make($params, [
    phone => [required, regex:/^1d{10}$/]//若果存在规则regex,最好通过数组方式。因为正则表达式中可能含有|会与规则分界符|混淆
], [
    phone.required => 手机号不能为空,
    phone.regex => 手机号格式错误
]);
if ($validator->fail) {
    throw new Exception($validator->errors[0]);
}

not_regex:pattern :验证参数必须排除正则表达式pattern。

in:value1,value2,... :验证参数key的值必须在所有value中。

not_in:value1,value2,... :验证参数key的值必须不在所有value中。

exists:table,field,params :验证参数key的值必须在表table字段field中。

$validator = Validator::make($params, [
    name => exists:test_db.user,name,//test_db为数据库名称
    //name => exists:user,//未设定field则默认字段
    //name => [exists => [user, name, [user_id => 1]]],//参数params为额外参数
], [
    name.exists => 名称已经存在
]);
if ($validator->fail) {
    throw new Exception($validator->errors[0]);
}

not_exists:table,field,params :验证参数key的值必须不在表table字段field中。

date :验证参数key的值必须是日期,且格式为‘2022-09-05’。

datetime :验证参数key的值必须是日期时间,且格式为‘2022-09-05 09:06:05’。

array :验证参数key的值必须是数组。

json :验证参数key的值必须是json。参数 decode 默认为0,当 decode =1时,则将解码之后的值保存在验证器params属性中。

$validator = Validator::make($params, [
    info => required|json:1,
], [
    info.required => 信息不能为空,
    info.json => 信息格式错误
]);
if ($validator->fail) {
    throw new Exception($validator->errors[0]);
}
//$validator->params[info];//解码后的info值

call :自定义验证函数,该函数有两个参数: $params$error

$validator = Validator::make($params, [
    num => [
        required,
        call => function(&$params, &$error) {
            if (1 == $params[type] && $params[num] > 10) {
                $error = 普通类型数量不能超过10个;
                return;
            }
            if (2 == $params && $params[num] < 5) {
                //如果为特殊类型,且数量小于5,则默认数量20
                $params[num] = 20;
            }
        }
    ],
], [
    info.required => 信息不能为空
]);
if ($validator->fail) {
    throw new Exception($validator->errors[0]);
}
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门