验证规则
版本 | 新增功能 |
---|---|
5.0.4 | 支持传入field 参数批量设置验证字段的描述信息 |
设置规则
可以在实例化Validate
类的时候传入验证规则,例如:
$rules = [
"name" => "require|max:25",
"age" => "number|between:1,120",
];
$validate = new Validate($rules);
也可以使用rule
方法动态添加规则,例如:
$rules = [
"name" => "require|max:25",
"age" => "number|between:1,120",
];
$validate = new Validate($rules);
$validate->rule("zip", "/^d{6}$/");
$validate->rule([
"email" => "email",
]);
规则定义
规则定义支持下面两种方式:
$rules = [
"name" => "require|max:25",
"age" => "number|between:1,120",
];
$validate = new Validate($rules);
对于一个字段可以设置多个验证规则,使用|
分割。
或者采用数组方式定义多个规则(适用于你的验证规则中有|
的情况)
$rules = [
"name" => ["require","max"=>25],
"age" => ["number","between"=>"1,120"],
];
$validate = new Validate($rules);
属性定义
通常情况下,我们实际在定义验证类的时候,可以通过属性的方式直接定义验证规则等信息,例如:
namespace appindexvalidate;
use thinkValidate;
class User extends Validate
{
protected $rule = [
"name" => "require|max:25",
"age" => "number|between:1,120",
"email" => "email",
];
protected $message = [
"name.require" => "名称必须",
"name.max" => "名称最多不能超过25个字符",
"age.number" => "年龄必须是数字",
"age.between" => "年龄只能在1-120之间",
"email" => "邮箱格式错误",
];
}
验证数据
下面是一个典型的验证数据的例子:
$rule = [
"name" => "require|max:25",
"age" => "number|between:1,120",
"email" => "email",
];
$msg = [
"name.require" => "名称必须",
"name.max" => "名称最多不能超过25个字符",
"age.number" => "年龄必须是数字",
"age.between" => "年龄只能在1-120之间",
"email" => "邮箱格式错误",
];
$data = [
"name" => "thinkphp",
"age" => 10,
"email" => "thinkphp@qq.com",
];
$validate = new Validate($rule, $msg);
$result = $validate->check($data);
如果需要批量验证,可以使用:
$validate = new Validate($rule, $msg);
$result = $validate->batch()->check($data);
批量验证如果验证不通过,返回的是一个错误信息的数组。
如果你定义了User验证器类的话,可以使用下面的验证代码:
$data = [
"name" => "thinkphp",
"age" => 10,
"email" => "thinkphp@qq.com",
];
$validate = Loader::validate("User");
if(!$validate->check($data)){
dump($validate->getError());
}
闭包函数验证
可以对某个字段使用闭包验证,例如:
$validate = new hinkValidate([
"name" => function($value,$data) {
return "thinkphp"==$value ? true : false;
},
]);
第一个参数是当前字段的值,第二个参数是全部数据
自定义验证规则
系统内置了一些常用的规则,如果还不够用,可以自己扩展验证规则。
如果使用了验证器的话,可以直接在验证器类添加自己的验证方法,例如:
namespace appindexvalidate;
use thinkValidate;
class User extends Validate
{
protected $rule = [
"name" => "checkName:thinkphp",
"email" => "email",
];
protected $message = [
"name" => "用户名必须",
"email" => "邮箱格式错误",
];
// 自定义验证规则
protected function checkName($value,$rule,$data)
{
return $rule == $value ? true : "名称错误";
}
}
验证方法可以传入的参数共有5
个(后面三个根据情况选用),依次为:
- 验证数据
- 验证规则
- 全部数据(数组)
- 字段名
- 字段描述
并且需要注意的是,自定义的验证规则方法名不能和已有的规则冲突。
接下来,就可以这样进行验证:
$validate = Loader::validate("User");
if(!$validate->check($data)){
dump($validate->getError());
}
如果没有使用验证器类,则支持使用extend
方法扩展验证规则,例如:
$validate = new Validate(["name" => "checkName:1"]);
$validate->extend("checkName", function ($value, $rule) {
return $rule == $value ? true : "名称错误";
});
$data = ["name" => 1];
$result = $validate->check($data);
支持批量注册验证规则,例如:
$validate = new Validate(["name" => "checkName:1"]);
$validate->extend([
"checkName"=> function ($value, $rule) {
return $rule == $value ? true : "名称错误";
},
"checkStatus"=> [$this,"checkStatus"]
]);
$data = ["name" => 1];
$result = $validate->check($data);
设置字段信息
V5.0.4+
版本开始,验证类的架构方法支持传入field
参数批量设置字段的描述信息,例如:
$rule = [
"name" => "require|max:25",
"age" => "number|between:1,120",
"email" => "email",
];
$field = [
"name" => "名称",
"age" => "年龄",
"email" => "邮箱",
];
$data = [
"name" => "thinkphp",
"age" => 10,
"email" => "thinkphp@qq.com",
];
$validate = new Validate($rule, [] , $field);
$result = $validate->check($data);