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 】
相关推荐: Linux系统命令中tree命令详解 如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体 如何构建满足综合性能需求的优质建站方案? 如何破解联通资金短缺导致的基站建设难题? 详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四) 如何在IIS7中新建站点?详细步骤解析 Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】 bootstrap日历插件datetimepicker使用方法 如何为不同团队 ID 动态生成多个“认领值班”按钮 zabbix利用python脚本发送报警邮件的方法 MySQL查询结果复制到新表的方法(更新、插入) javascript中的数组方法有哪些_如何利用数组方法简化数据处理 HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】 如何快速查询网站的真实建站时间? HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】 ,网页ppt怎么弄成自己的ppt? Laravel如何实现API版本控制_Laravel API版本化路由设计策略 php静态变量怎么调试_php静态变量作用域调试技巧【解答】 Android使用GridView实现日历的简单功能 Laravel PHP版本要求一览_Laravel各版本环境要求对照 如何正确选择百度移动适配建站域名? php json中文编码为null的解决办法 香港服务器网站生成指南:免费资源整合与高速稳定配置方案 Laravel怎么实现验证码(Captcha)功能 Laravel如何使用Gate和Policy进行授权?(权限控制) Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解 如何在万网ECS上快速搭建专属网站? 微信小程序 配置文件详细介绍 晋江文学城电脑版官网 晋江文学城网页版直接进入 如何彻底删除建站之星生成的Banner? ,交易猫的商品怎么发布到网站上去? Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】 如何基于云服务器快速搭建个人网站? Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤 Python函数文档自动校验_规范解析【教程】 如何快速搭建高效可靠的建站解决方案? Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤 Laravel如何生成API文档?(Swagger/OpenAPI教程) 佛山网站制作系统,佛山企业变更地址网上办理步骤? 网站页面设计需要考虑到这些问题 如何在七牛云存储上搭建网站并设置自定义域名? 北京企业网站设计制作公司,北京铁路集团官方网站? Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码? 如何快速生成可下载的建站源码工具? 千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】 Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO) rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】 Laravel如何与Pusher实现实时通信?(WebSocket示例) 手机怎么制作网站教程步骤,手机怎么做自己的网页链接?


过滤器,钩子相当于事件,都是采用AOP思想。