美文网首页TP5.1
TP5巧用验证器

TP5巧用验证器

作者: 祥哥去哪里 | 来源:发表于2017-11-15 22:04 被阅读0次
tp5

前言:

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

目录:

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

1.创建验证器

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


image.png

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

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

这里我们把他取名为baseValidate

image.png

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

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文件夹下


image.png

取名为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 false;
        }
    }

!!注意:这里如果判断失败:返回的不是false 返回的是错误信息。
我辈年轻指出,check方法只会返回bool值。感谢指出错误!

3. 调用验证

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

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

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

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

好了,本次tp5验证器的介绍了就写到这里了,如果有什么地方不对,希望大神指正.谢谢。
以上

相关文章

  • TP5巧用验证器

    前言: 我们在做API开发的时候,我们会接受客户端传来的参数,大家都知道这个参数是不可信的,我们后端开发人员必须对...

  • tp5 验证器

    两种使用方法第一种 定义专用类 调用 (推荐) 调用方法 第二种 传参调用

  • tp5 的验证码功能不可用

    本地使用正常,把程序放在了服务器,发现验证码功能不可用。tp5的验证码功能是vender/topthink/thi...

  • tp5 -- 验证器相关

    验证器中提示信息的几种写法 例如规则

  • Thinkphp基础教程

    写了点tp5的基础教程 创建类,命名空间,use 获取请求参数 验证器 抛出异常错误 SQL文件,请手动创建数据库...

  • 让TP5 Validate支持二维数组验证

    TP5 Validate 只支持一维数组的验证 , 没有像laravel 的那种二维验证. 修改 thinkphp...

  • tp5的验证码

    tp5的验证码 [TOC] 安装captcha: 验证码配置 图像的显示 模板文件: 视图能加载类库的方法,也可以...

  • ThinkPHP5小程序笔记(二)

    TP5数据库 惰性连接,节省资源;TP5中使用查询构造器不使用原生sql的好处是,TP5编写了一套规范,语法简单的...

  • 4、TP5架构总览

    我们来看看TP5的架构。 ThinkPHP 5.0基于MVC(模式、视图、控制器)方式来组织。 TP5的访问url...

  • tp5控制器验证规则Validate

    https://www.kancloud.cn/manual/thinkphp5/129356

网友评论

    本文标题:TP5巧用验证器

    本文链接:https://www.haomeiwen.com/subject/ocghvxtx.html