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

发布时间 - 2022-04-24 00:00:00    点击率:

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

推荐学习:《PHP视频教程》

一、中间件的作用

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

行为钩子和中间件的区别:中间件:它是对项目请求做处理,在用户访问我们的项目时,中间件就可以对于这个请求来判断用户是否有权限,或者判断用户是否存在非法访问;行为钩子:在某一动作开始或者结束的时候会触发的方法,比如用户注册成功记录日志;中间件是对用户请求做处理,而钩子则是对用户动作的处理,中间件相当于过滤器,钩子相当于事件,都是采用AOP思想。

二、定义中间件

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

php think make:middleware Check

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

param('name') == 'index') {
            return redirect('/');//重定向到首页
        }

        return $next($request);//返回的是一个Response对象
    }
}

 中间件说明:

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

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

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

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

public function handle($request, \Closure $next, $name){
    if ($name == 'index') {
        return redirect('/');//重定向到首页
    }

    return $next($request);
}

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);

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

同一个路由也支持注册多个中间件,只需要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);
    }
}

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

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

public function index(Request $request)
{
	return $request->result;
}

推荐学习:《PHP视频教程》


# thinkphp  # 可以使用  # 是一个  # 首页  # 多个  # 重定向  # 李四  # 可以直接  # 的是  # 都是  # 就会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在腾讯云服务器快速搭建个人网站?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  如何在IIS7上新建站点并设置安全权限?  Laravel如何使用Gate和Policy进行授权?(权限控制)  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  微信公众帐号开发教程之图文消息全攻略  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何自定义分页视图?(Pagination示例)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何挑选优质建站一级代理提升网站排名?  如何用好域名打造高点击率的自主建站?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  javascript如何操作浏览器历史记录_怎样实现无刷新导航  JavaScript如何操作视频_媒体API怎么控制播放  实例解析angularjs的filter过滤器  如何在宝塔面板中创建新站点?  IOS倒计时设置UIButton标题title的抖动问题  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Python结构化数据采集_字段抽取解析【教程】  Linux系统命令中tree命令详解  大学网站设计制作软件有哪些,如何将网站制作成自己app?  奇安信“盘古石”团队突破 iOS 26.1 提权  iOS发送验证码倒计时应用  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何实现API速率限制?(Rate Limiting教程)  微信小程序 配置文件详细介绍  如何基于PHP生成高效IDC网络公司建站源码?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel如何生成URL和重定向?(路由助手函数)  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Firefox Developer Edition开发者版本入口  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  如何做网站制作流程,*游戏网站怎么搭建?  Python进程池调度策略_任务分发说明【指导】  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何批量查询域名的建站时间记录?  如何打造高效商业网站?建站目的决定转化率  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  北京网站制作的公司有哪些,北京白云观官方网站?