Thinkphp5.1详细讲解中间件的用法

 3795

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了关于中间件的用法,包括了什么是前置中间件、后置中间件,还有路由中间件、全局中间件等等相关内容,下面一起来看一下,希望对大家有帮助。

Thinkphp5.1详细讲解中间件的用法

一、中间件的作用

中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。

行为钩子和中间件的区别:

中间件:它是对项目请求做处理,在用户访问我们的项目时,中间件就可以对于这个请求来判断用户是否有权限,或者判断用户是否存在非法访问;

行为钩子:在某一动作开始或者结束的时候会触发的方法,比如用户注册成功记录日志;

中间件是对用户请求做处理,而钩子则是对用户动作的处理,中间件相当于过滤器,钩子相当于事件,都是采用AOP思想。

二、定义中间件

首先,可以通过cmd命令行指令快速生成中间件,在项目的根目录里执行以下cmd命令:

  1. php think make:middleware Check

这个指令会 application/http/middleware目录下面生成一个Check中间件,代码如下:

  1. <?php
  2.  
  3. namespace app\http\middleware;
  4.  
  5. class Check
  6. {
  7.     public function handle($request, \Closure $next)
  8.     {
  9.         if ($request->param('name') == 'index') {
  10.             return redirect('/');//重定向到首页
  11.         }
  12.  
  13.         return $next($request);//返回的是一个Response对象
  14.     }
  15. }

中间件说明:

1、中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包;

2、中间件handle方法的返回值必须是一个Response对象;

3、中间件里可以直接使用Request对象,获取请求参数;

4、在某些需求下,可以使用第三个参数传入额外的参数;

  1. public function handle($request, \Closure $next, $name){
  2.     if ($name == 'index') {
  3.         return redirect('/');//重定向到首页
  4.     }
  5.  
  6.     return $next($request);
  7. }


1、前置中间件

前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。

  1. <?php
  2.  
  3. namespace app\http\middleware;
  4.  
  5. class Before
  6. {
  7.     public function handle($request, \Closure $next)
  8.     {
  9.         // 先执行中间件代码
  10.         return $next($request);
  11.     }
  12. }

2、后置中间件

后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。

  1. <?php
  2.  
  3. namespace app\http\middleware;
  4.  
  5. class After
  6. {
  7.     public function handle($request, \Closure $next)
  8.     {
  9.         $response = $next($request);
  10.         //后执行中间件代码
  11.         return $response;
  12.     }
  13. }


三、注册中间件

1、路由中间件

顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。

  1. //用户登录的路由
  2. Route::rule('login','index/User/login')->middleware('Auth');

或者使用完整的中间件类名:

  1. Route::rule('login','index/User/login')->middleware(app\http\middleware\Auth::class);

说明:中间件的注册建议使用完整的类名,如果没有指定命名空间则默认使用app\http\middleware作为命名空间

同一个路由也支持注册多个中间件,只需要middleware()里用逗号隔开即可:

  1. Route::rule('login','index/User/login')->middleware(['Auth', 'Check']);

Thinkphp5.1.8+ 版本后,支持对路由分组注册中间件,如下:

  1. //一个名为user的路由分组
  2. Route::group('user', function(){
  3.     Route::rule('login','index/User/login');
  4.     Route::rule('register','index/User/register');
  5. })->middleware('Auth');


2、全局中间件

意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。

在application目录下创建middleware.php文件,代码如下:

  1. <?php
  2. return [
  3.     //第1个中间件
  4.     \app\http\middleware\Auth::class,
  5.     //第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间)
  6.     'Check',
  7. ];


3、模块中间件

Thinkphp5.1.8+版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。


4、控制器中间件

Thinkphp5.1.17+版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的think\Controller类,然后在控制器中定义middleware属性,例如:

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4.  
  5. class Index extends Controller{
  6.  
  7.     protected $middleware = ['Auth'];
  8.  
  9.     public function index()
  10.     {
  11.         return 'index';
  12.     }
  13. }


5、使用闭包定义中间件

在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回Response对象实例。

  1. Route::group('hello', function(){
  2.     Route::rule('login','index/User/login');
  3. })->middleware(function($request,\Closure $next){
  4.     if ($request->param('name') == 'index') {
  5.         return redirect('/');//重定向到首页
  6.     }    
  7.     return $next($request);
  8. });


四、给中间件传入参数

1、全局中间件传参数

  1. <?php
  2. return [
  3.     [\app\http\middleware\Auth::class, '张三'],
  4.     'Check:李四',
  5. ];

上面的定义表示给Auth中间件传入参数为张三,给Check中间件传入参数为李四


2、路由中间件传参数

(1)、给Auth中间件传入参数张三

  1. Route::rule('login','index/User/login')->middleware('Auth:张三');

也可以这样写:

  1. Route::rule('login','index/User/login')->middleware(Auth::class, '张三');

(2)、给多个中间件传入同一个参数

  1. Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);


五、中间件向控制器传参数

前面讲的给中间件传入特定的参数 (常量),那么中间要如何向控制器传入参数呢?我们可以通过给Request请求对象赋值的方式传参给控制器(或者其它地方),例如:

  1. <?php
  2. namespace app\http\middleware;
  3.  
  4. class Auth
  5. {
  6.     public function handle($request, \Closure $next)
  7.     {
  8.         //给控制器传参数
  9.         $request->result = '验证成功';       
  10.         return $next($request);
  11.     }
  12. }

需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。


然后在控制器的方法里面可以直接使用:

  1. public function index(Request $request)
  2. {
  3.     return $request->result;
  4. }


TAG标签:
本文网址:https://www.zztuku.com/detail-11743.html
站长图库 - Thinkphp5.1详细讲解中间件的用法
申明:本文转载于《CSDN》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐