请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

ThinkPHP6.0学习笔记-验证器

[复制链接]
查看: 84|回复: 0

2万

主题

2万

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
76529
发表于 2020-9-15 18:03 | 显示全部楼层 |阅读模式
验证器

By:Mirror王宇阳
验证器定义

验证器的使用,必须定义它;系统提供了一条命令直接生产一个验证器类:
  1. php think make:validate User
复制代码
自动再应用目录下生成一个validate文件夹,并生成User.php类
  1. namespace app\validate;use think\Validate;class User extends Validate{    /**     * 定义验证规则     * 格式:'字段名'        =>        ['规则1','规则2'...]     *      '字段名'           =>        '规则1|规则2...'     *     * @var array     */                protected $rule = [        'name'      =>      'require|max:20',        'price'     =>      'number|between:1,100',        'email'     =>      'email'    ];        /**     * 定义错误信息     * 格式:'字段名.规则名'        =>        '错误信息'     *     * @var array     */            protected $message = [        'name.require'      =>  '姓名不得为空',        'name.max'          =>  '姓名不得大于20位',        'price.number'      =>  '价格必须是数字',        'price.between'     =>  '价格位于1~100之间',        'email'             =>  '邮箱格式错误'    ];}
复制代码
自动生成的两个属性:
$rule:定义规则
$message:定义错误信息 ,如果不定义错误信息提示默认的错误信息
验证器定义之后,进行调用测试,创建一个Verify.php控制器:
  1. namespace app\controller;use app\validate\User;use think\exception\ValidateException;class Verify{    public function index()    {        try {            validate(User::class)->check([                'name'  =>  '蜡笔小新',                'price' =>   90,                'email' =>  'xiaoxin@qq.com'            ]);        } catch (ValidateException $err){            dump($err->getError());        }    }}
复制代码
当验证规则出现一个错误后就会停止之后字段的判断
批量验证
  1. class Verify{    public function index()    {        try {            $result = validate(User::class)                ->batch(true)->check([                'name'  =>  '蜡笔小新',                'price' =>   90,                'email' =>  'xiaoxin@qq.com'            ]);            if(true !== $result){                dump($result);            }        } catch (ValidateException $err){            dump($err->getError());        }    }}
复制代码
自定义规则

系统内置提供了部分常用的规则;同时也允许开发者自定义规则:
  1. protected function checkName($value,$rule){    return $rule != $value ? true : '存在非法字符';}
复制代码
自定义规则支持传入五个参数:

  • 验证数据
  • 验证规则
  • 全部数据(数组)
  • 字段名
  • 字段描述
验证规则

规则定义
  1. protected $rule = [        'name'      =>      'require|max:20',        'price'     =>      'number|between:1,100',        'email'     =>      'email'    ];
复制代码
不仅仅支持字符串模式,也支持数组模式
  1. protected $rule = [        'name'      =>      [                                                'require',                                                'max' =>        10         ],        'price'     =>      [                                        'number',                                    'between' => '1,100'        ],        'email'     =>      ['email']    ];
复制代码
数组模式是在规则复杂的时候使用
独立验证
上述的各种验证规则都需要调用validate目录下的验证器文件,而Think支持在控制器文件下独立验证;这种不依赖验证器文件的调用方式是一种独立、唯一的调用方式
  1. namespace app\controller;use think\facade\Validate;class Verify{    public function index()    {        $validate = Validate::rule([            'name'      =>      'require|max:20',            'price'     =>      'number|between:1,100',            'email'     =>      'email'        ]);        $result = $validate->chech([            'name'  =>  '蜡笔小新',            'price' =>   90,            'email' =>  'xiaoxin@qq.com'        ]);        if (!$result){            dump($validate->getError());        }    }}
复制代码
独立验证支持对象化的定义方式,但不支持属性方法的定义:
  1. namespace app\controller;use think\facade\Validate;use think\facade\ValidateRule as Rule;class Verify{ public function index() {     $validate = Validate::rule([         'name'      =>      'Rule::isRequire()->max(20)',         'price'     =>      'Rule::isNumber()->between([1,100])',         'email'     =>      'Rule::isEmail()'     ]);     $result = $validate->chech([         'name'  =>  '蜡笔小新',         'price' =>   90,         'email' =>  'xiaoxin@qq.com'     ]);     if (!$result){         dump($validate->getError());     } }}
复制代码
独立验证支持闭包自定义方法:(不支持字段多规则)
  1. $validate = Validate::rule([        'name'=> function($value){                return $value != '' ? true : '姓名不得为空';        },        'price'=> function($value){            return $value > 0 ? true:'不得低于零';        }]);
复制代码
错误信息

单独定义提示信息
在验证器类中定义message属性:
  1. protected $message = [    'name.require'      =>  '姓名不得为空',    'name.max'          =>  '姓名不得大于20位',    'price.number'      =>  '价格必须是数字',    'price.between'     =>  '价格位于1~100之间',    'email'             =>  '邮箱格式错误'];
复制代码
错误信息支持数组定义,并通过JSON方式交给前端
  1. protected $message = [        'name.require' => ['code' => 1001, 'msg' => '名称必须'],        'name.max'     => ['code' => 1002, 'msg' => '名称最多不能超过25个字符'],        'age.number'   => ['code' => 1003, 'msg' => '年龄必须是数字'],        'age.between'  => ['code' => 1004, 'msg' => '年龄必须在1~120之间'],        'email'        => ['code' => 1005, 'msg' =>'邮箱格式错误'],];
复制代码
独立验证定义错误提示
  1. ValidateRule::isEmail(null,'格式不正确')
复制代码
参数一:验证规则
参数二:自定义错误提示
也可以独立使用message()方法:
  1. Validate->[……]->message([……])
复制代码
验证场景

验证场景设置:即特定的场景写是否进行验证,独立验证不存在场景验证;
新增数据需要验证邮箱信息,而修改数据不需要验证邮箱信息
  1. namespace app\validate;use think\Validate;class User extends Validate{        protected $rule = [        'name'      =>      'require|max:20',        'price'     =>      'number|between:1,100',        'email'     =>      'email'    ];    protected $message = [        'name.require'      =>  '姓名不得为空',        'name.max'          =>  '姓名不得大于20位',        'price.number'      =>  '价格必须是数字',        'price.between'     =>  '价格位于1~100之间',        'email'             =>  '邮箱格式错误'    ];    protected $scene = [        // 新增数据验证三个字段        'insert'       =>   ['name','price','email'],        // 更新数据验证两个字段        'edit'         =>   ['name','price']    ];}
复制代码
  1. try {    validate(User::class)->scene('edit')->check([        'name'  =>  '蜡笔小新',        'price' =>   90,        'email' =>  'xiaoxinqq.com'    ]);} catch (ValidateException $err){    dump($err->getError());}
复制代码
在控制端设置scene()就成功的限制只验证name和price两个字段
scene支持为单个场景单独定义方法,方法的命名规范是scene+场景名,采用驼峰写法;
同时在验证类中支持公共方法对场景中的细节进行定义:
  1. public function sceneEdit(){    return $this->only(['name','price'])        ->append('name','min:5')        ->remove('price','between')        ->append('price','require|max:20');}
复制代码
append 追加
remove 移除
(不要对一个字段多次操作,会导致覆盖;可以同时操作)
only 约束字段
路由验证

路由验证:在路由参数调用验证类进行验证
  1. protected $rule = [    'id' => 'number|between:1,10'];protected $message = [    'id.between'        =>        'id介于1~10之间',    'id.number'                =>        'id必须是数字'];protected $scene = [    'route'        =>        ['id'];];
复制代码
  1. Route::rule('vr/:id','Verify/route')->validate(User::class,'route');//只执行route场景
复制代码
也支持使用独立的验证方式,这里不赘述……
内置规则

ThinkPHP6.0开发手册-内置规则
静态方法支持两种形式:::number() 、isNumber()方法验证
格式验证类

属性/方法描述require/::isRequire不得为空number/::isNumber验证字段是否为纯数字integer/::isInteger验证字段是否为整数float/::isFloat验证字段是否为浮点数boolean/::isBoolean验证字段是否为布尔值email/::isEmail验证字段是否为邮箱格式array/isArray验证字段是否为数组accepted/isAccepted验证字段是否为yes/ondate/isDate验证字段是否为有效日期alpha/isAlpha验证字段是否为纯字母alphaNum/isAlphaNum验证字段是否为纯字母数字组合alphaDash/isAlphaDash验证字段是否为字母数字下划线破折号组好chs/isChs验证字段是否为汉字chsAlpha/isChsAlpha验证字段是否为汉字字母chsAlphaNum/isChsAlphaNum验证字段是否为汉字字母和数字chsDash/isChsDash验证字段是否为字母数字下划线破折号组好和汉字cntrl/isCntrl验证字段是否为控制字符(空格、缩进)graph/isGraph验证字段是否为可打印字符(不包括空格)print/isPrint验证字段是否为可打印字符(包括空格)lower/isLower验证字段是否为小写upper/isUpper验证字段是否为大写space/isSpace验证字段是否为空白字符xdigit/isXdigit验证字段是否为十六进制activeUrl/isActiveUrl验证字段是否为有效域名url/isUrl验证字段是否为有效URL地址ip/isIp验证字段是否为有效IP地址deteFormat:format验证字段的日期时间格式mobile验证字段是否为有效手机号idCard验证身份证格式macAddr验证MAC地址格式zip验证有效邮政编码长度和区间验证类

属性描述in验证字段是否在某个范围notIn验证字段是否不再某个范围between验证字段是否在某个区间notBetween验证字段是否不在某个区间length验证长度是否在某个范围或指定长度max/min验证最大/最小长度(大小)after验证是否在某个日期之后before验证是否在某个日期之前expire验证当前值是否在某个时间区间内allowip验证当前值是否在某个IP段范围内denyIp验证当前值IP是否为禁止访问的IP字段比较类

属性描述confirm:field验证字段的值是否和其它的值一致different:field验证字段的值是否和其它的值不一致eq/same/=验证是否等于某个值egt / >=验证是否大于等于某个值gt/>验证是否大于某个值elt/ '\d{6}';'data' => 'regex:\d{6}';[/code]若表达式中包含或逻辑,需要使用数组方式定义
  1. 'data' => ['regex'=>'/^(yes|on|1)$/i']
复制代码
同时也可以预定义
  1. namespace app\index\validate;use think\Validate;class User extends Validate{    protected $regex = [ 'zip' => '\d{6}'];        protected $rule = [        'name'  =>  'require|max:25',        'email' =>  'email',    ];}
复制代码
然后就可以使用
  1. 'zip'        =>        'regex:zip',
复制代码
表单令牌验证:token

参考连接:https://www.kancloud.cn/manual/thinkphp6_0/1037632
验证请求字段唯一:unique

可以验证当前请求的字段值是否为唯一的
  1. unique:[table],[field],[except],[pk]
复制代码
table:指定数据表
field:其他字段
except:排除某个主键值
pk:指定某个主键值排除
  1. // 表示验证name字段的值是否在user表(不包含前缀)中唯一'name'   => 'unique:user',// 验证其他字段'name'   => 'unique:user,account',// 排除某个主键值'name'   => 'unique:user,account,10',// 指定某个主键值排除'name'   => 'unique:user,account,10,user_id',
复制代码
require:

[table]属性描述requireIf:field,value验证某个字段的值等于某个值的时候必须requireWith:field验证某个字段有值的时候必须requireWithout:field验证某个字段没有值的时候必须requireCallback:callable验证当某个callable为真时候字段必须静态调用验证

静态调用:使用facade模式进行调用验证,适合验证单个数据
引入facade中的Validate时候可能会发生冲突,需要留意;
  1. dump(Validate::isEmail('xiaoxin@qq.com'));
复制代码
静态调用支持多规则验证:checkRule()
  1. Validate::checkRule(10, 'number|between:1,10');
复制代码
注解验证

参考官方:https://www.kancloud.cn/manual/thinkphp6_0/1375936
安装额外的扩展:
  1. composer require topthink/think-annotation
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表