侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ThinkPHP5 验证器的具体使用

ThinkPHP  /  管理员 发布于 7年前   300

前言:

我们在做API开发的时候,我们会接受客户端传来的参数,大家都知道这个参数是不可信的,我们后端开发人员必须对这个参数进行验证。我在之前的开发中只是知道tp5的验证器,并不知道他的用途,因为之前的开发验证,往往都是基于模型字段进行的验证。而验证器更适用与API开发,今天就简单讲下验证器的使用

目录:

  1. 创建验证器
  2. 书写单独验证器
  3. 调用验证

1.创建验证器

首先我们需要一个文件夹来存放我们的验证器,我们在模块下创建一个同控制器平级的文件夹,取名为validate

然后我们就可以来建立验证器了,我们只需要创建一个类,继承tp5的validate类就可以了。

但是熟悉面向对象思想的朋友一定知道,当我们需要一个方法每个验证器都要用到,但是又不去修改tp5的源码时。我们就多写一个类来作为我们的基类。所有的验证器都继承这个基类,然后这个基类再去继承tp5的validate类。

这里我们把他取名为baseValidate

那么现在再创建一个正儿八经的验证器了。举个例子:

namespace app\index\validate;use think\Validate;class User extends Validate{  protected $rule = [    'name' => 'require|max:25',    'email' => 'email',  ];}

再到控制器或者模型中去实例化再调用

//虚拟一组数据,实际开发中是接受用户传递的数据$data = [  'name'=>'thinkphp',  'email'=>'[email protected]'];$validate = Loader::validate('User');if(!$validate->check($data)){  dump($validate->getError());}

这样一个验证器的应用就写好了。我们来看看有没有什么可以简化的地方。

  1. 首先需要被验证的数据是我们从客户端那接受过来的那么,第一步接受数据
  2. 然后我们要对数据进行验证,如果验证不通过,返回错误信息

这两部是每次接口被请求都是要做的。那么我们就想把这个封装到BaseValidate中去

namespace app\home\validate;use think\Exception;use think\Request;use think\Validate;class BaseValidate extends Validate{  public function goCheck($data='')  {    //实例化请求对象    $requestObj=Request::instance();    //如果传入为空则获取请求里的参数    empty($data)&&$data=$requestObj->param();    if ($this->check($data)) {      //如果验证通过了      return true;    }else{      //如果验证没通过      $error=$this->getError();      //抛出异常      throw new Exception($error);    }  }}

这个goCheck方法封装好后,有人可能会问,这个验证规则在哪里呢?

2. 书写单独验证器

之前有说过BaseValidate是用来被继承的,那么真正的验证器,我们还没有开始写。规则就制定到这个验证器中。为了更深入的理解,这里举例子顺便使用了自定义验证 规则。其实tp写好了的验证规则应该很够用了

我们就拿最常接受的数据来举例子,那就是 id 同常这个id就代表了我们数据库中某条数据的id,这个id我们往往设计为无符号自动递增的主键,翻译成人话就是正整数。那么如果客户传来的参数是负数或者小数那么就不应该通过验证。

我们根据上述需求,我们来创建一个验证器。位置还是跟之前的一样在validate文件夹下

取名为IdMustBePositiveInt.php(名字有点长,不过好在望文知意)

首先肯定是要继承我们的基础验证器

class IdMustBePositiveInt extends BaseValidate

然后制定规则,为一个固定的成员变量赋值

  protected $rule = [  //require是内置规则,而tp5并没有正整数的规则,所以下面这个positiveInt使用自定义的规则    'id' => 'require|positiveInt'  ];

那么自定义规则怎么干呢,其实也简单。定义一个被保护的方法

//系统会自动传入几个参数 第一个是 要验证的值,第二个是规则,自己可以规定规则内容或者不写,第三个是最初传入的data。其实不只这三个参数,想了解详细的可以看看文档 protected function positiveInt($value, $rule='', $data)  {    if (is_int(($value+0))&&($value+0)>0) {      return true;    }else{      return 'id必须为正整数';    }  }

!!注意:这里如果判断失败:返回的不是false 返回的是错误信息。

3. 调用验证

根据我们之前的封装,我们需要达到的效果就是接受参数,验证参数一体。那么现在我们如何调用验证呢

厉害的来了,我们还是以id为例

 public function test($id)  {    //在控制器中直接调用写上这行代码就搞定验证了    (new IdMustBePositiveInt)->goCheck();  }
  1. 就这样的一句代码,直接搞定验证。当我们实例化id验证器,调用它父类的goCheck方法。
  2. goCheck方法会接受参数,并且将参数传入validate对象上check方法
  3. 就会去匹配我们在id验证器中$rule中规定的require规则和我们自定义的规则。
  4. 如果都通过就会返回true
  5. 如果其中一条不匹配则会抛出异常

这次只举了id为例子,虽然看上去比直接写独立验证麻烦很多,但是大家仔细想想,这个验证规则其实在很多地方都是一样的,比如密码验证规则,用户名验证规则等,当这个项目写完了。你已经完成了很多验证器。其实在下个项目中还可以继续套用的哦

TP5验证规则使用

①静态调用(使用内置的规则验证单个数据,返回值为布尔值)

// 日期格式验证Validate::dateFormat('2016-03-09','Y-m-d'); // true// 验证是否有效的日期Validate::is('2016-06-03','date'); // true// 验证是否有效邮箱地址Validate::is('[email protected]','email'); // true// 验证是否在某个范围Validate::in('a',['a','b','c']); // true// 验证是否大于某个值Validate::gt(10,8); // true// 正则验证Validate::regex(100,'\d+'); // true

②模型验证(在模型中的验证方式)

$User = new User;$result = $User->validate(  [    'name' => 'require|max:25',    'email'  => 'email',  ],  [    'name.require' => '名称必须',    'name.max'   => '名称最多不能超过25个字符',    'email'    => '邮箱格式错误',  ])->save($data);if(false === $result){  // 验证失败 输出错误信息  dump($User->getError());}

③控制器验证(控制器中进行验证)

如果你需要在控制器中进行验证,并且继承了\think\Controller的话,可以调用控制器类提供的validate方法进行验证,如下:

$result = $this->validate(  [    'name' => 'thinkphp',    'email' => '[email protected]',  ],  [    'name' => 'require|max:25',    'email'  => 'email',  ]);if(true !== $result){  // 验证失败 输出错误信息  dump($result);}

控制器中的验证代码可以简化为:

$result = $this->validate($data,'User');if(true !== $result){  // 验证失败 输出错误信息  dump($result);}

如果要使用场景,可以使用:

$result = $this->validate($data,'User.edit');if(true !== $result){  // 验证失败 输出错误信息  dump($result);}

在validate方法中还支持做一些前置的操作回调,使用方式如下:

$result = $this->validate($data,'User.edit',[],[$this,'some']);if(true !== $result){  // 验证失败 输出错误信息  dump($result);}

好了,本次tp5验证器的介绍了就写到这里了,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:

  • 基于thinkPHP3.2实现微信接入及查询token值的方法
  • Thinkphp5 微信公众号token验证不成功的原因及解决方法
  • thinkphp5框架API token身份验证功能示例
  • ThinkPHP5.1表单令牌Token失效问题的解决
  • 完美解决thinkphp验证码出错无法显示的方法
  • ThinkPHP验证码使用简明教程
  • ThinkPHP令牌验证实例
  • thinkPHP实现表单自动验证
  • ThinkPHP表单自动验证实例
  • 详解ThinkPHP3.2.3验证码显示、刷新、校验
  • thinkphp框架使用JWTtoken的方法详解


  • 上一条:
    thinkPHP5框架设置404、403等http状态页面的方法
    下一条:
    thinkPHP框架中执行事务的方法示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客