中间件的作用相当于一个过滤作用,比如用浏览器访问A页面,我们定义了一个B中间件,会执行B中间件。
概要中我们已经描述了中间件的运行过程,相信大家很容易理解他的功能,现在ThinkPHP添加了这个功能,那我们就来具体实现一下。
使用命令生成一个CheckName的中间件,作用是如何请求中的name值不是dreamphp,我们就让它跳转到百度,如果是,我们就正常访问即可,命令:php think make:middleware CheckName
这个时候我们会发现application文件夹下面多了一个http文件件,里面就是我们刚才生成的中间件,后置中间件用处不大,我们就不做讲解了,我们只实现一下前置中间件
我们在中间件中判断name是否是dreamphp,不是就跳转百度,是的话就正常执行,代码如下

需要注意的是中间件的返回值必须是Response对象,我们可以使用Response类自己生成,也可以用控制器基类中的success、error、redirect,redirect助手函数也是Response对象,这里我们就使用的是redirect助手函数。
中间件分为全局中间件、模块中间件、路由中间件,全局中间件就是对所有请求都生效,模块中间件就是只对某个模块的请求生效,路由中间件对我们自定义的路由生效。
全局中间件的实现,我们在application文件及下创建一个middleware.php配置文件,配置如下:

现在我们在index模块的Index控制器中的index方法写如下内容:

当我们输入http://域名/index.php/index/index/index/name/dreamphp的时候,就会正常访问,执行如下

当我们输入的name参数不是dreamphp的时候,例如,http://域名/index.php/index/index/index/name/dream的时候,就会跳转到百度,这个就不截图了。全局中间件实现。
模块中间件就是把middleware.php放入要执行中间件的模块中,效果大家自行实现,这个中间件只会对这个模块的请求执行,其它模块不执行。
路由中间件就是我们在路由定义文件中定义,打开route.php路由定义文件,写如下代码

这个中间件就只会在这条路由上执行,其它都不执行。
是不是感觉很简单呀,钩子和初始化方法都可以实现中间件的功能,但是定义那些请求执行中间件的操作没有中间件方便。
教学QQ:305530751