Thinkphp中间件的用法及作用是啥,如何定义中间件
Admin 2022-07-25 群英技术资讯 1563 次浏览
这篇文章主要讲解了“Thinkphp中间件的用法及作用是啥,如何定义中间件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Thinkphp中间件的用法及作用是啥,如何定义中间件”吧!
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。
行为钩子和中间件的区别:
中间件:它是对项目请求做处理,在用户访问我们的项目时,中间件就可以对于这个请求来判断用户是否有权限,或者判断用户是否存在非法访问;
行为钩子:在某一动作开始或者结束的时候会触发的方法,比如用户注册成功记录日志;
中间件是对用户请求做处理,而钩子则是对用户动作的处理,中间件相当于过滤器,钩子相当于事件,都是采用AOP思想。
首先,可以通过cmd命令行指令快速生成中间件,在项目的根目录里执行以下cmd命令:
php think make:middleware Check
这个指令会 application/http/middleware目录下面生成一个Check中间件,代码如下:
<?php
namespace app\http\middleware;
class Check
{
public function handle($request, \Closure $next)
{
if ($request->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); }
前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。
<?php
namespace app\http\middleware;
class Before
{
public function handle($request, \Closure $next)
{
// 先执行中间件代码
return $next($request);
}
}后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。
<?php
namespace app\http\middleware;
class After
{
public function handle($request, \Closure $next)
{
$response = $next($request);
//后执行中间件代码
return $response;
}
}顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。
//用户登录的路由
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');意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。
在application目录下创建middleware.php文件,代码如下:
<?php
return [
//第1个中间件
\app\http\middleware\Auth::class,
//第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间)
'Check',
];Thinkphp5.1.8+版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。
Thinkphp5.1.17+版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的think\Controller类,然后在控制器中定义middleware属性,例如:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller{
protected $middleware = ['Auth'];
public function index()
{
return 'index';
}
}在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回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、全局中间件传参数
<?php
return [
[\app\http\middleware\Auth::class, '张三'],
'Check:李四',
];上面的定义表示给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请求对象赋值的方式传参给控制器(或者其它地方),例如:
<?php
namespace app\http\middleware;
class Auth
{
public function handle($request, \Closure $next)
{
//给控制器传参数
$request->result = '验证成功';
return $next($request);
}
}
需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。
然后在控制器的方法里面可以直接使用:
public function index(Request $request)
{
return $request->result;
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
laravel的加密方法:1、利用Hash,语法“bcrypt('需要加密的文本')”或“Hash::make('需要加密的文本')”;2、使用Laravel的加密器,语法“encrypt('需要加密的文本')”。
在本篇文章里小编给大家整理的是一篇关于php实例化对象的实例方法,有需要的朋友们可以跟着学习下。
在PHP内部,系统维护着连接状态,其状态有三种可能的情况:0-NORMAL(正常)1-ABORTED(异常退出)2-TIMEOUT(超时)当PHP脚本正常地运行NORMAL状态时,...
在学习PHP过程中,连接MySQL数据库并且查询是必须要掌握的知识,那么php连接mysql查询数据要怎么做呢?下面介绍一下实现简易查询的教程,有这方面学习需求的朋友可以看看。
1.文件缓存:2.Memcached; 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。//初始化$cache=newMemcache();$cache->pconnect(127.0.0.1,11
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008