7_2:Validate 验证器使用 + 内置规则
一 验证器的定义
1)知识大纲
1 验证规则 $rule [ 属性 ]
2 错误提示 $message [ 属性 ]
3 验证场景 $scene [ 属性 ]
4 细腻的场景验证 $sceneName() [ 方法 ] scene不能修改
5 自定义验证规则 $funName() [ 方法 ] 参数1,2必须 3-5选填
2)使用范例
<?php namespace app\admin\validate; use think\validate; class Demo extends Validate { //1 验证规则 protected $rule = [ 'name' => ['require','max'=>10,'checkName'=>'李白'],//数组形式传入 'email|邮箱' => 'require|email',//字符串形式传入 'age' => 'require|number|betweent:20,50', ]; //2 错误提示 protected $message = [ 'name.require' => ['code'=>100,'msg'=>'姓名不能为空'],//数组形式传入 'name.max' => '名称不能大于10位',//字符串形式传入 'email.require' => '邮箱不能为空', 'email.email' => '邮箱格式错误', 'age.between' => '年龄范围不合法' ]; //3 验证场景 protected $scene = [ 'edit' => ['name','email'], ];
//4 更细腻的场景验证 [ 是方法 ] protected function sceneEdit(){ return $this->only(['name','age']) ->remove('name','max')->append('name','min:2'); //only 需要验证的字段 //remove 需要移除的属性 //append 需要添加的属性
注意事项
//对一个字段多次规则的补充 [ 追加 或 删除 ]
//remove('name', 'xxx|yyy|zzz')或 remove('name', ['xxx', 'yyy', 'zzz']); //正确的调用 //remove('name', 'xxx')->remove('name', 'yyy')->remove('name', 'zzz'); //错误的调用 后面的会覆盖前面的
}
//5 自定义验证方法 3-5可选参数 protected function checkName($value,$rule,$data,$field,$title){ var_dump($value);//需要验证的值 var_dump($rule);//验证规则 var_dump($data);//提交的所有数据 var_dump($field);//哪个字段再使用当前规则 var_dump($title);//字段的说明 return $value != $rule ? true : '这个名称不能注册';//如果相等 就不能注册 } }
二 控制器使用
1)调用验证类的四个方法
<?php namespace app\admin\controller; use think\facade\View; use app\admin\validate\Demo as DemoValidate; class Demo { public function index(){ $validate = new DemoValidate();//1 new 实例化别名调用 $validate = validate(DemoValidate::class); //2 助手函数 别名调用 $validate = validate('app\admin\validate\Demo'); //3 助手函数 全命名空间调用 $validate = validate('Demo');//4 助手函数 只写文件名 系统自动定位调用 $validate = validate('DemoValidate');//助手函数 别名调用不到 return View::fetch(); } }
2)使用范例
<?php namespace app\admin\controller; use think\facade\View; use app\admin\validate\Demo as DemoValidate; use think\exception\ValidateException; class Demo { public function index(){ //1 try catch方式 try{ //场景验证scene 批量验证batch 验证check validate(DemoValidate::class)->scene('add')->batch(true)->check([ 'name' => 'fdf', 'email' => '' ]); } catch (ValidateException $e) { echo $e->getError(); } //2 用 if 判断 $validate = new DemoValidate(); if (!$validate->scene('add')->batch(true)->check([ 'name' => 'fdf', 'email' => 'ff' ])) { return $validate->getError(); } } } 两种方式: 1、try catch 抛出异常 2、if return 错误信息 常用的验证方法 scene('add') //场景验证 batch(true) //批量验证 check($data) //执行验证 为什么批量验证 1、在验证过程中有一个子段通不过,后面的就不验证了,所以需要批量验证。 2、批量验证放回是数组 3、批量验证方法batch()必须放在check()方法前面
三 内置规则
1)格式验证
2)长度 和 区间验证
3)字段比较类
4)filter验证
支持使用 filter_var 进行验证
'ip'=>'filter:validate_ip'
5)正则验证
'zip'=>'\d{6}', // 或者 'zip'=>'regex:\d{6}',
6)上传验证
1 是否是一个上传文件 file
2 是否是一个图像文件 image:width,height,type [ width和height必须同时定义 width height type 都是可选 ]
3 验证上传文件后缀 fileExt
4 验证上传文件类型 fileMine
5 验证上传文件大小 fileSise
7)其他验证
1 表单令牌验证 token:表单令牌名称
2 字段值唯一验证 unique
3 其他的用到再看手册