前置操作
首先,在实际业务中假设这样一个场景,我需要做一套管理系统的,这个管理系统是教师对学生进行管理的一个工具,那么,甲方还给出这样的需求,主任的权限更多,可以进行更多的操作,而老师的权限较低,拥有的权限少。
那么对于每一个服务端的接口来说,有分为老师和主任两种类型的用户进行请求接口,可能对于学籍信息删除这一操作老师没有这样的权限,但是主任有这样的权限,这时候我们就需要在每一个接口前面加一个权限的判断,但是主任有权限的而老师没有权限的接口可能有几十个,那么我们每个接口的开头都写一个重复的权限判断就显得有点冗余。
我们就可以借助ThinkPHP提供的前置操作来帮助我们减少这种冗余的情况,让封装性更好。
还有什么情况可以使用,例如很多接口需要验证token的有效性但是不需要用token取出东西来,我们就可以借助前置操作来完成。
我们来看这个前置操作是什么,这是ThinkPHP 5官方文档里面是这么写的,如果你想指定某些操作前先执行某个函数的话你就可以调用这个前置操作,什么意思呢,换而言之就是我们每个接口的前面需要验证登入者的权限,那么我们就可以在需要的接口前面调用我们的前置操作来帮助我们完成任务。
那么我们往下看前置方法要如何使用:
红框内的三个方法就是定义的前置方法,TP这里提供了三种将前置方法加载自己的方法前面的写法,首先beforeActionList最上面的那个'first'后面没有跟随其他的东西,说明他是作用于该控制器下的所有方法的,也就是每一个方法的前面都会先调用这个first前置操作
同理,second将作用于除了hello的方法上也就是data
third将作用于指定的hello和data的方法上
官网文档给出示例:
结果和我们想象的一样
在自己的ThinkPHP上使用前置操作:
看到官方文档里面的前置操作的方法是写在当前控制器下面的,我们可以为所有的控制器建造一个父类,也就是基类,然后我们共有的方法都可以放在里面。
然后我们在自己的控制器继承基类,并且采用前置操作,可以看到前置操作的三个方法我们都写在了父类里面并且采用protected类型,然后基类的验证方法的具体实现我们写进model里面。
可以看到我们让检验第一权限的方法作用于testFirstPermission方法前,检验二级权限的方法作用于testSecondPermission方法之前。
方法的实现如下:
里面有注释就不解释了
该方法作用于testFirstPermission方法上,所以我们可以测试一下testFirstPermission方法,因为我们是通过Cache来存储权限的,所以我们首先要存入Cache:(Cache相关可以看我的博客https://blog.csdn.net/qq_36652619/article/details/81140939)
我们先调用一下存入缓存的方法:
ps:路由如下(路由相关我的博客 https://blog.csdn.net/qq_36652619/article/details/80292318)
调用成功,我们可以看到存入缓存了
ok,可以看到token为token1的用户的权限为100, token为token2的用户的权限为200
ps:权限定义如下
一级是200,二级是100
那么我们使用token1去验证testFirstPermission接口理论上是不会成功的,因为100的权限不足够,一级权限最低为200
让我们来验证是否真的是这样的:
结果和我们想象的一样
如果我们输入足够的权限的话也就是token2的话,是如何呢?
验证成功
ok没有问题,接下来我们再来测试一下token的有效性
方法是这样的,如果从Cache中能找到缓存说明有效,找不到说明无效
从上面我们存入缓存来看,只有token1、token2、token3才是有效token,那么我们给出一个无效的会如何
验证是不通过的,如果给出正确的就可以通过了
以上就是ThinkPHP 5的前置操作的简单使用