Thinkphp5.1中间件的用法


老K
老K 2022-09-21 09:15:39 64728
分类专栏: 资讯

版本要求:

从Thinkphp5.1.6+版本开始,正式引入中间件的支持。

目录

一、中间件的作用

二、定义中间件

1、前置中间件

2、后置中间件 

 三、注册中间件

1、路由中间件

2、全局中间件

3、模块中间件

4、控制器中间件 

5、使用闭包定义中间件

 四、给中间件传入参数

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


一、中间件的作用

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

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

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

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

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

二、定义中间件

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

php think make:middleware Check

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

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

 中间件说明:

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

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

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

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

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

1、前置中间件

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

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

2、后置中间件 

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

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

 三、注册中间件

1、路由中间件

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

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

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

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

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

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

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

3、模块中间件

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

4、控制器中间件 

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

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

5、使用闭包定义中间件

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

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

 四、给中间件传入参数

1、全局中间件传参数

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

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

2、路由中间件传参数

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

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

 也可以这样写:

Route::rule('login','index/User/login')->middleware(Auth::-variable language_">class, '张三');

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

Route::rule('login','index/User/login')->middleware([Auth::-variable language_">class, 'Check'], '张三');

(3)、单独指定各个中间件的参数

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

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

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

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

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

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

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

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=8722
赞同 0
评论 0 条
老KL0
粉丝 0 发表 13 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1487
银河麒麟打印带有图像的文档时出错  1405
银河麒麟添加打印机时,出现“server-error-internal-error”  1194
统信操作系统各版本介绍  1116
统信桌面专业版【如何查询系统安装时间】  1114
统信桌面专业版【全盘安装UOS系统】介绍  1068
麒麟系统也能完整体验微信啦!  1026
统信【启动盘制作工具】使用介绍  672
统信桌面专业版【一个U盘做多个系统启动盘】的方法  616
信刻全自动档案蓝光光盘检测一体机  526
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!