thinkphp6 入门(6)--中间件是什么 怎么用

这篇具有很好参考价值的文章主要介绍了thinkphp6 入门(6)--中间件是什么 怎么用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是中间件?

当客户端发送请求至服务器时,HTTP请求会经过多个中间件,最后返回响应给客户端。中间件可以

  • 在请求到达目标控制器或动作之前对请求进行操作

  • 可以在响应离开目标控制器或动作之前对响应进行操作

二、中间件的作用

我们可以在不修改应用程序逻辑的情况下添加额外的功能,如

  • 登录验证、

  • 检查用户权限、权限控制

  • 请求过滤

  • 判断当前浏览器环境是在微信或支付宝

  • 写系统日志

  • 统计

三、中间件的类型

1、前置中间件

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

一般用来检查用户权限

在app/middleware中新建中间件,每个中间件一个文件

thinkphp6 入门(6)--中间件是什么 怎么用,PHP,中间件,thinkphp

<?php

namespace app\middleware;

// 前置行为的中间件
class AuthMiddleware
{
    public function handle($request, \Closure $next)
{
        // 添加中间件执行代码 start
        echo ' </br>hello </br>';

        // 添加中间件执行代码 end

        return $next($request);
    }
}


2、后置中间件

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

一般用来写日志、统计

<?php

namespace app\middleware;

// 后置行为的中间件
class LogMiddleware
{
    public function handle($request, \Closure $next)
{
    $response = $next($request);

        // 添加中间件执行代码 start
        echo ' </br>good bye!</br>';

        // 添加中间件执行代码 end

        return $response;
    }
}

中间件说明:

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

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

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

四、使用中间件

根据作用范围可以分为4种中间件

全局中间件->应用中间件->路由中间件->控制器中间件

  1. 全局中间件 

全局中间件在app目录下面middleware.php文件中定义

thinkphp6 入门(6)--中间件是什么 怎么用,PHP,中间件,thinkphp

2. 应用中间件 

直接在应用目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该应用下面生效。

thinkphp6 入门(6)--中间件是什么 怎么用,PHP,中间件,thinkphp

 
<?php

return [
    app\middleware\AuthMiddleware::class,
];

访问该应用下的任何一个函数,都会先执行了中间件

thinkphp6 入门(6)--中间件是什么 怎么用,PHP,中间件,thinkphp

3. 路由中间件

访问了对应的路由,则会调用对应的中间件,可以调用多个

Route::rule('hello/:name','hello')  ->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);

4. 控制器中间件

在控制器中定义middleware属性,例如:

thinkphp6 入门(6)--中间件是什么 怎么用,PHP,中间件,thinkphp

上述代码指定了该控制器下的所有函数被调用都会执行对应的控制器

thinkphp6 入门(6)--中间件是什么 怎么用,PHP,中间件,thinkphp

可以通过“except"和‘only’字段为控制器中函数自定义调用的中间件


<?php
namespace app\addons\controller;
use think\Controller;

class Index extends Controller{
    // auth中间件,使用了except,表示出了hello方法外,这个控制器其他的方法都会执行这个中间件
    // check中间件,使用了only表示只有这个控制器的login方法执行这个中间件
    // log中间件,没有使用任何限定参数,表示这个控制器里面所有的方法都会执行log这个中间件
    protected $middleware = [
        'auth' => ['except' => ['hello']],
        'check' => ['only' => 'login'],
        'log'
    ];
    public function index(){
        echo "this is a addons index controller index function";
    }
    public function login(){
        echo "abcd";
    }
    public function hello(){
        echo "abcd";
    }
}

五、向中间件传参

可以使用第三个参数传入额外的参数。

<?php

namespace app\middleware;

class Check
{
    public function handle($request, \Closure $next, $name)
{
        if ($name == 'think') {
            return redirect('index/think');
        }

        return $next($request);
    }
}

下面是给auth中间件传入了一个参数的值'admin'

Route::rule('hello/:name','hello')  ->middleware('auth', 'admin')        ->middleware('hello', 'thinkphp');

六、中间件向控制器传参

<?php

namespace app\middleware;

class Hello
{
    public function handle($request, \Closure $next)
{
        $request->hello = 'ThinkPHP';
        
        return $next($request);
    }
}

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

public function index(Request $request){  return $request->hello; // ThinkPHP}

参考:

https://www.php.cn/faq/559015.html

https://www.php.cn/faq/591280.html

https://www.php.cn/faq/562939.html

https://www.kancloud.cn/manual/thinkphp6_0/1037493

https://www.gxlsystem.com/phpkuangjia-2336420.html

软件工程小施同学

20230909文章来源地址https://www.toymoban.com/news/detail-703325.html

到了这里,关于thinkphp6 入门(6)--中间件是什么 怎么用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【中间件】MQ是什么?RabbitMQ又是什么?

    大家好,我是卷心菜。如果您看完这篇文章有所收获,可以三连支持博主哦~,嘻嘻。 🎁 作者简介: 在校大学生一枚,Java领域新星创作者,Java、Python正在学习中,期待和大家一起学习一起进步~ 💗 个人主页:我是一棵卷心菜的个人主页 🔶 本文专栏:RabbitMQ学习 📕 自我提

    2024年02月02日
    浏览(48)
  • NestJS入门6:日志中间件

    前文参考: NestJS入门1 NestJS入门2:创建模块 NestJS入门3:不同请求方式前后端写法 NestJS入门4:MySQL typeorm 增删改查 NestJS入门5:加入Swagger ​ ​ ​ logger.middleware.ts修改为: ​     app.modules.ts修改为: ​  可改为星号通配符,表示任意路由 使用postman或swagger测试,后端可以看

    2024年02月21日
    浏览(49)
  • .net core 中什么是中间件

    在 .NET Core 中,中间件(Middleware)是 ASP.NET Core 应用程序处理请求和响应的组件。中间件位于应用程序的请求处理管道中,它可以截获请求,执行一些逻辑,并将请求传递给下一个中间件或终止请求的执行。 中间件的主要作用是实现横切关注点,处理跨请求的功能和任务,例

    2024年01月17日
    浏览(64)
  • 你们分库分表使用什么中间件,有什么优点和缺点?

    根据自己的实际使用来说: cobar 阿里 b2b 团队开发和开源的,属于 proxy 层方案。早些年还可以用,但是最近几年都没更新了,基本没啥人用,差不多算是被抛弃的状态吧。而且不支持读写分离、存储过程、跨库 join 和分页等操作。 mycat 基于 cobar 改造的,属于 proxy 层方案 ,

    2024年02月09日
    浏览(46)
  • 中间件系列 - Redis入门到实战(原理篇)

    学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 Redis数据结构 Redis网络模型 Redis通信协议-RESP协议 我们都知道Redis中保

    2024年02月03日
    浏览(49)
  • 中间件系列 - Redis入门到实战(基础篇)

    学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 本章学习目标: 初始Redis 认识NoSQL 认识Redis 安装Redis Redis桌面客户端 Redis常见命

    2024年02月04日
    浏览(45)
  • 【Spring Cloud】服务容错中间件Sentinel入门

    欢迎来到阿Q社区 https://bbs.csdn.net/topics/617897123 Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于 服务容错 的综合性解决方案。它以流量为切入点,从 流量控制、熔断降级、系统负载保护 等多个维度来保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景 :

    2024年04月15日
    浏览(41)
  • 在Node.js中,什么是中间件(middleware)?它们的作用是什么?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月06日
    浏览(45)
  • 中间件系列 - Redis入门到实战(高级篇-多级缓存)

    学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 JVM进程缓存 Lua语法入门 实现多级缓存 缓存同步策略 传统的缓存策略

    2024年02月03日
    浏览(59)
  • 【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件

    目录 前言 初识express 使用express创建基本的web服务器 初识express路由 路由匹配概念 路由模块化 中间件 中间件和路由的区别 定义中间件函数 中间件作用   局部生效中间价 中间件分类  1.应用级别中间件  2.路由级别的中间件  3.错误级别中间件  4.内置中间件  5.自定义中间

    2024年02月02日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包