ThinkPHP5之Validate和Validate层的封装

版本:TP5

    学后台的小伙伴应该都对ThinkPHP有一定的了解,比如说最传统的MVC思想,大家肯定对这三个层背的很熟,模型、控制器、视图,并且很多人或许都认为TP框架就是这三个层,把他们分开,封装好,就相当于用框架完成了一个项目。
    其实TP不只限于这些,分层的这种思想其实是想让我们的后台代码更加的纯粹,模块与模块之间,方法与方法之间,让整套代码更加的顺畅,减少冗余。通过TP对于类的封装和调用,有一定的理解。
    
   说了这么多,我们在这篇文章里面要做的事情就是,在我们的项目模块里面开多一层,我把它叫做Validate层,Validate从直面意思就可以知道是验证的意思,所以我们这一层的主要功能就是用来验证一些信息,它的原理就是使用了TP5手册中所介绍的Validate验证器,所以我们的层级也和它的名字一致。

TP5之Validate

    首先,我们先从TP的Validate验证器开始介绍,因为好多小伙伴都懒得看TP的手册。

    第一步,我们要使用这个验证器的话先要引入它在TP中的类。
    
    我这里为了测试建立一个一个xx模块,和一个test控制器,控制器下面新建一个叉叉方法,首先我们引入一下内置的Validate类,并且对类进行一个实例化,实例化是什么大家应该都知道。

好了,从图中看的话,我们实例化Validate的时候是在里面传入了一个数组,那么这个数组代表了什么,我们不急,进到Validate这个类里面去看一看。



我们进到TP内部的Validate类中可以看到他这里把注释都打好了,构造函数第一个参数是一个数组,这个数组代表的是验证规则,所以我们在实例化的时候传入的是一个验证规则,那么验证规则应该怎么写呢?


这两行规则的意思是代表,我们所要验证的数组中的name字段是必须存在的,并且它的最大长度不超过25,第二行代表所验证的数组中的email字段的内容必须符合TP5所规定的邮箱的格式,否则的话会输出错误。(当然,如果我们觉得TP封装的邮箱格式不满意的话,我们是可以修改它的规则的,可以自己封装一个方法,用到正则验证,然后把方法名放到我们的规则里就ok了,后面封装类的时候我会介绍。)

当然,TP其实封装了很多很好用的规则,我们要尽量善用这些规则,那么,这些规则在哪里可以看到呢。我已经整理在我的博客里了,欢迎大家去里面找:

好了,规则我们定义好了,那么我们要怎么去验证我们想要验证的东西呢,这里是调用了它类里面的一个方法:


check方法会验证你的数据是否符合初始化的时候定义的规则,getError方法会调出你数据不符合规则的时候是哪一部分有问题。



第一个参数是想要验证的数据,第二个参数是rule,而本类的rule已经在初始化的时候规定了规则,所以他就会去校验规则。
我们来看一下结果。

我们在上面截图中想要验证的那些关键的信息都没有问题,验证是成功的。

那么我们看一下如果给一些不符合的数据的话会发生什么情况。



这样子的话他就会报错:





Validate层的封装

到了这一步,我想要介绍的TP5给大家提供的Validate验证器就已经结束了,大家了解了Validate验证器是什么之后,我们就可以开始我们的封装Validate层了。
抛出几个问题:
1.为什么要验证数据?
首先,如果你要处理的业务逻辑不可以允许有一个空的用户名存在的话,前端没有做监听,后台要做判断的话,是不是要写一个if,邮箱格式又要写一个if,这样子if堆了一堆,代码十分难看,那么我们这个Validate可以把所有的验证一次性验证完,这样的话代码是不是整洁多了。

2.那么我们已经会了Validate验证器之后,为什么还要把它封装层Validate层?
这个问题非常好解释,因为不够牛逼,为什么不够牛逼?因为我写一个Validate的层我还要写十几行代码,每个接口都要写十几行代码,是不是不够爽,如果我一行代码解决掉Validate验证过程,这样,才算牛逼。


首先新建文件夹,在文件夹下面新建一个base类,这个常规操作大家都晓得


然后我们的base类继承一下Validate的类,自己写一个gotocheck方法去简化Validate的调用



传入的data变量是一个数组,也就是我们想要验证的数据,result代表了我们验证的结果是成功还是失败
$arr是我们获取到失败之后的报错信息,其中的key代表的是属性的名字,value代表的是报错的信息。我们只要报错的信息,并且只要第一条报错的信息,后面的不管,我们就这样子写了这个循环,然后输出错误,如果成功的话就返回成功。

我们的基本验证方法封装完了之后,我们要封装我们的验证规则了,因为不同接口的验证规则不同,所以每个接口都应该拥有一套规则,这样子的话我们就要把每套数组封装成一个类文件,这样的话就解释了我们为什么要封装一个Validate的层:


那么我们的类文件要怎么写呢?TP手册给我们定义了一套写法:


大家可以看到rule中的password的规则里面有一条IsCharacter,这其实是我们封装的一个方法,用了这个方法,我们就可以让数据根据完全由自己掌控的一个方法去验证它,这样子的话,规则就完完全全掌握在自己手里了。
preg_match这个正则匹配我就不细说了,大家感兴趣的话可以去学学正则。

而这个方法的传入的参数这四个其实是固定的,如果想知道为什么的话可以去TP5的手册上深究,它是模仿了内置的一个方法去写的。

说了这么多,到了见证奇迹的时候,一行代码完成我们的验证层:




可以看到,我们从十几行,几十行代码直接缩成了一行,并且将所有的Validate规则封装成类,将它们层级化

来看看结果:(因为password是不符合我们的规定的)


结果是我们想要的结果。

好啦,本期课程到此结束

猜你喜欢

转载自blog.csdn.net/qq_41921511/article/details/80762136