验证器
验证器可以利用写好的规则进行快速的验证并且提示出错误信息
验证使用独立的think\Validare
类
//任何时候,都可以使用Validate类进行独立的验证操作
$validate = new Validate([
'name' => 'require|max:25',
'email' => 'email'
]);
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
];
if (!$validate->check($data)) {
dump($validate->getError());
}
验证使用验证器进行验证
//定义一个\app\index\validate\User验证器类用于User的验证
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'email' => 'email',
];
}
//在需要进行User验证的地方,添加如下代码即可:
$data = [
'name'=>'thinkphp',
'email'=>'thinkphp@qq.com'
];
$validate = Loader::validate('User');
if(!$validate->check($data)){
dump($validate->getError());
}
//Loader-加载|check-校验
//使用助手函数实例化验证器
$validate = validate('User');
验证规则
设置规则
规则定义
在$rules=['name'=>'require'];
中使用多个规则有两种方法可供选择
1.使用管道符'name'=>'require|max:25'
2.使用数组'name'=>['require','max'=>25]
属性定义
protected $rule = ['name' => 'require|max:25'];
protected $message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符'
];
数据验证(含批量,控制器类,闭包,自定义)
$rule=['name'=>'require|max:25',];
$msg=['name.require'=>'名称必填',];
$data=['name'=>'admin123'];
//普通验证
$validate=new Validate($rule,$msg);
$result=$validate->check($data);
//批量验证
$validate=new Validate($rule,$msg);
$result=$validate->batch()->check($data);
//使用定义的验证器验证
$validate = Loader::validate('User');
if(!$validate->check($data)){
dump($validate->getError());
}
//闭包函数验证
$validate = new \think\Validate([
'name' => function($value,$data) {
//第一个参数是当前字段值,第二个参数是全部数据
return 'thinkphp'==$value ? true : false;
},
]);
//自定义验证规则
class User extends Validate
{
protected $rule = [
'name' => 'checkName:thinkphp',
'email' => 'email',
];
protected $message = [
'name' => '用户名必须',
'email' => '邮箱格式错误',
];
// 自定义验证规则
protected function checkName($value,$rule,$data)
{
//$value,$rule,$data,$fieldname,$description
//验证数据,验证规则,全部数据(数组),字段名,字段描述
return $rule == $value ? true : '名称错误';
}
}
错误信息
- 使用默认的错误提示信息(默认)
- 验证规则和提示信息分开(推荐)
- 验证规则和提示信息一起定义
- 使用多语言(不常用)
验证场景
场景验证只验证场景中规定的字段
//验证不同场景
$rule=[...];
$msg=[...];
$data=[...];
$validate = new Validate($rule);
$validate->scene('edit', ['name', 'age']);
$result = $validate->scene('edit')->check($data);
//使用验证器类
protected $rule=[];
protected $message=[];
protected $scene=['edit'=>['name','age']];
//然后在需要验证的地方使用scene方法
$data=[...];
$validate=new \app\index\validate\User($rule);
$result=$validate->scene('edit')->check($data);
也可以在定义场景的时候对某些字段的规则重新设置
protected $scene=[
'edit'=>['name','age'=>'require|number|between:1,120'],
];
scene-场景
验证方式:验证器验证(首选)、控制器的验证方法验证、模型类的方法验证(废弃)
验证规则:内置了非常丰富的内置规则;自定义规则;
错误信息:只需要定义信息文字即可在出现错误时返回错误信息
验证场景:根据需要在不同的情况下灵活使用已经定义好的验证规则->scene
('场景')
高级的使用:批量验证(返回的错误是数组;每个字段是一个元素;每个字段只返回一个错误)、表单令牌(跨域提交csrf跨站脚本攻击)
*内置规则
require-必须 | number/integer/float-数字 | email-邮箱地址 | array-数字 |
---|---|---|---|
accepted-yes/no/1 | date-日期 | alpha-字母 | alphaNum-字母和数字 |
alphaDash-字母/数字/_/- | chs-汉字 | chsAlpha-汉字/字母 | chsAlphaNum-汉字/字母/数字 |
chsDash-汉字/字母/数字/_/- | activeUrl/url/ip | dateFormat:format:y-m-d-指定格式日期 | length |
max/min | in/notIn/between/notBetween | after:日期-之前 | before:日期-之后 |
expire:开始时间,结束时间 | confirm:-比较另一个字段值 | different:-比较另一值不一致 | eq/same-等于某个值 |
eqt/>=-大于等于 | gt/>-大于 | elt/<=-小于等于 | lt/<-小于 |
正则 | 上传 | 行为 | 其他验证 |
控制器验证
[验证方式①]验证器验证:定义一个验证器的类,在控制器中进行验证
验证成功:返回true;
验证失败:返回false;如果需要获取错误信息:$validate->getError();
$validate = Loader::validate('Users');
$result = $validate->check($post);
//$result = $validate->batch(true)->check($post);
if(!$result){
//var_dump($validate->getError());
$this->error($validate->getError());
//return json($validate->getError());
}
[验证方式②]控制器的验证方法:
验证成功:返回true;
验证失败:返回错误信息;
- @param array $data 数据
- @param string|array $validate 验证器名或者验证规则数组
- @param array $message 提示信息
- @param bool $batch 是否批量验证
- @param mixed $callback 回调方法(闭包)
$result = $this->validate($post,'Users');
//$result = $this->validate($post,'Users',[],true);
if(true !== $result){
//var_dump($result);
$this->error($result);
}
exit("验证通过!");
评论