这篇文章主要介绍了关于ThinkPHP5 验证器的具体使用,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

前言:

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

目录:创建验证器

书写单独验证器

调用验证

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'=>'thinkphp@qq.com'

];

$validate = Loader::validate('User');

if(!$validate->check($data)){

dump($validate->getError());

}

这样一个验证器的应用就写好了。我们来看看有没有什么可以简化的地方。首先需要被验证的数据是我们从客户端那接受过来的那么,第一步接受数据

然后我们要对数据进行验证,如果验证不通过,返回错误信息

这两部是每次接口被请求都是要做的。那么我们就想把这个封装到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();

}

就这样的一句代码,直接搞定验证。当我们实例化id验证器,调用它父类的goCheck方法。

goCheck方法会接受参数,并且将参数传入validate对象上check方法

就会去匹配我们在id验证器中$rule中规定的require规则和我们自定义的规则。

如果都通过就会返回true

如果其中一条不匹配则会抛出异常

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

TP5验证规则使用

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

// 日期格式验证

Validate::dateFormat('2016-03-09','Y-m-d'); // true

// 验证是否有效的日期

Validate::is('2016-06-03','date'); // true

// 验证是否有效邮箱地址

Validate::is('thinkphp@qq.com','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' => 'thinkphp@qq.com',

],

[

'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验证器的介绍了就写到这里了,希望对大家的学习有所帮助。

相关推荐:

php验证器的调用,ThinkPHP5 验证器的具体使用相关推荐

  1. android唤醒音乐播放器,android调用音乐播放器,三种方

    小弟想请问一下.怎样在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了.主要是有两种方法,可是都不是我想要的. 第一种是.使用mp3音乐文件的uri.和intent,进行调用.可是这样 ...

  2. python装饰器详解-python 装饰器详解

    目录 一.装饰器遵循的原则 装饰器,顾名思义就是起装饰的作用,既然是装饰,那么被装饰的对象是啥样就是啥样,不能有丝毫改变.在这里,我们写装饰器就是必须把握不能修改被修饰函数的源代码这条铁律.如何遵循这 ...

  3. ThinkPHP5 验证器validate的使用总结(详细)

    ================================================================== ============ThinkPHP5 验证器validate ...

  4. yii 验证器类 细说YII验证器

    在 yii-1.1.10.r3566 版本中,yii自带的验证器共有 19 个.全部如下: // CValidator.php public static $builtInValidators=arr ...

  5. jsf表单验证_JSF验证示例教程–验证器标签,定制验证器

    jsf表单验证 JSF validation model defines a set of standard classes for validating the UI components. The ...

  6. python 装饰器实现事件绑定_Python装饰器实现几类验证功能做法实例

    最近新需求来了,要给系统增加几个资源权限.尽量减少代码的改动和程序的复杂程度.所以还是使用装饰器比较科学 之前用了一些登录验证的现成装饰器模块.然后仿写一些用户管理部分的权限装饰器. 比如下面这种 调 ...

  7. springmvc 拦截器、国际化、验证

    2019独角兽企业重金招聘Python工程师标准>>> springmvc 拦截器 继承了HandlerIntercepter的类可以作为拦截器类: package com.yawn ...

  8. Java web登录拦截器_SpringMVC拦截器(实现登录验证拦截器)

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 核心代码 首先是index.jsp,显示链接 String path = request.getContextPath(); String ...

  9. python用户登录(输入用户名和密码)dic_Python使用装饰器模拟用户登陆验证功能示例...

    本文实例讲述了Python使用装饰器模拟用户登陆验证功能.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #!python3 user_list = [ {'name' ...

最新文章

  1. 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
  2. pythonista安卓版下载-pythonista 3ios
  3. 计算机 运行命令,教你电脑运行命令
  4. timer数据库总显示连接不上服务器,asp.net 上传服务器后,MSSQL数据库连接问题
  5. 哪吒:猪八戒十年DevOps演进之路
  6. Entity Framework Core 3.1 和 Entity Framework 6.4 发布
  7. python进阶21之actor
  8. DXF文件中将多段线凸度转换成圆弧
  9. 鸿蒙生死印的是千叶影儿,逆天邪神:千叶影儿口中的可怕因素,其实并不难猜测...
  10. Android studio中todo的用法
  11. python输出输入法_python 怎么转化输入法
  12. 10个知识学习app,开始武装自己的大脑吧!
  13. 布线前,布局这步极为关键!分享一些PCB设计布线注意要点
  14. Photoshop合成雪景天使美女照片
  15. linux 内核配置简介
  16. Instagram帐户几种不同类型的封号情况及解决方案
  17. ab测试时结果显示大量Request failed的情况分析
  18. GTSAM在windows下安装,配置,简单调试
  19. 解决Chrome浏览器启动页被劫持篡改为360
  20. 打包过程中出现failed to create process.

热门文章

  1. 泛型与操作符重载杂谈
  2. 【OpenCV】使用projectPoints实现透视图到俯视图的变化效果
  3. 【Linux学习】epoll详解
  4. python变长参数传递
  5. linux系统中 库分为静态库和,你知道linux 静态库和共享库?
  6. Linux Graphic DRI 显示子系统 介绍1
  7. iOS 分类添加属性
  8. java程序在eclipse上运行和导出文件运行结果不同
  9. Caffeine Cache~高性能 Java 本地缓存之王
  10. 我们已经不用 AOP 做日志很久了!