推荐学习:《PHP视频教程》
一、中间件的作用
中间件主要用于拦截或过滤应用的HTTP
请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。
二、定义中间件
首先,可以通过cmd命令行指令快速生成中间件,在项目的根目录里执行以下cmd命令:
php think make:middleware Check
这个指令会 application/http/middleware
目录下面生成一个Check
中间件,代码如下:
param("name") == "index") { return redirect("/");//重定向到首页 } return $next($request);//返回的是一个Response对象 }}
1、前置中间件
前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。
2、后置中间件
后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。
三、注册中间件
1、路由中间件
顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。
//用户登录的路由Route::rule("login","index/User/login")->middleware("Auth");或者使用完整的中间件类名:
Route::rule("login","index/User/login")->middleware(app\http\middleware\Auth::class);同一个路由也支持注册多个中间件,只需要middleware()里用逗号隔开即可:
Route::rule("login","index/User/login")->middleware(["Auth", "Check"]);Thinkphp5.1.8+ 版本后,支持对路由分组注册中间件,如下:
//一个名为user的路由分组Route::group("user", function(){Route::rule("login","index/User/login"); Route::rule("register","index/User/register");})->middleware("Auth");2、全局中间件
意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。
在application目录下创建middleware.php文件,代码如下:
3、模块中间件
Thinkphp5.1.8+
版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php
文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。4、控制器中间件
Thinkphp5.1.17+
版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的think\Controller
类,然后在控制器中定义middleware
属性,例如:5、使用闭包定义中间件
在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回
Response
对象实例。Route::group("hello", function(){Route::rule("login","index/User/login");})->middleware(function($request,\Closure $next){ if ($request->param("name") == "index") { return redirect("/");//重定向到首页 } return $next($request);});四、给中间件传入参数
1、全局中间件传参数
上面的定义表示给Auth中间件传入参数为张三,给Check中间件传入参数为李四
2、路由中间件传参数
(1)、给Auth中间件传入参数张三
Route::rule("login","index/User/login")->middleware("Auth:张三");也可以这样写:
Route::rule("login","index/User/login")->middleware(Auth::class, "张三");(2)、给多个中间件传入同一个参数
Route::rule("login","index/User/login")->middleware([Auth::class, "Check"], "张三");(3)、单独指定各个中间件的参数
Route::rule("login","index/user/login")->middleware(["Auth:张三", "Check:李四"]);五、中间件向控制器传参数
前面讲的给中间件传入特定的参数 (常量),那么中间要如何向控制器传入参数呢?我们可以通过给Request请求对象赋值的方式传参给控制器(或者其它地方),例如:
result = "验证成功"; return $next($request); }}然后在控制器的方法里面可以直接使用:
public function index(Request $request){return $request->result;}推荐学习:《PHP视频教程》
以上就是Thinkphp5.1详细讲解中间件的用法的详细内容,更多请关注php中文网其它相关文章!