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

2023-11-18

一、什么是中间件?

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

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

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

二、中间件的作用

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

  • 登录验证、

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

  • 请求过滤

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

  • 写系统日志

  • 统计

三、中间件的类型

1、前置中间件

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

一般用来检查用户权限

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

图片

<?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文件中定义

图片

2. 应用中间件 

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

图片

<?php
return [    app\middleware\AuthMiddleware::class,];

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

图片

3. 路由中间件

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

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

4. 控制器中间件

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

图片

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

图片

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

<?phpnamespace 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

thinkphp6 入门(6)--中间件是什么 怎么用 的相关文章

  • 如何在 Carbon Laravel 中添加日期和另一个日期?

    在我的 laravel 项目中 我想将日期时间增加到前一个日期时间 这是我的代码 expire order 0 gt expire date new Carbon now gt addMonths 6 这两行的结果是 2018 01 28
  • 获取今天的科普特日期

    我正在寻找获取今天的科普特日期与任何代码类型类似php or javascript在我的网站标题中显示科普特日期 我需要阿拉伯语或英语版本 我试图找到它 但没有找到类似的英文内容 参考 http www copticchurch net e
  • 垃圾邮件打败了我所有的验证码

    我有一个 WordPress 博客 我在上面使用验证码插件的时间最长 因为它有效 最近我收到了大量的垃圾邮件 然后我尝试执行通过 PHP 生成的 将这些随机数添加在一起 但仍然没有成功 我不太确定需要做什么来阻止这些垃圾邮件 但这很烦人 我
  • php中的$$是什么意思? [复制]

    这个问题在这里已经有答案了 变量后面的两个背对背 是什么意思 像这样 id 我在哪里可以找到更多相关信息 谢谢 In PHP 意味着您将给至少一名维护程序员带来多年的痛苦和折磨 请注意 您最终可能会成为维护程序员 它是一个可变变量 想象一下
  • xdebug.remote_handler 在 PHP.INI 中设置,但未在 PHPinfo 中显示

    我正在尝试让 Xbdebug 与 NetBeans 一起运行 以便调试一些 PHP 代码 我确信几年前我已经让它工作了 然后切换了 IDE 现在想切换回来 When I try to debug the status bar shows 并
  • 在laravel中组合两个不同的无关系数据库表查询进行分页

    我的数据库中有两个不相关的表 我需要将它们合并 以便我可以将其放在我的搜索视图中 但我不知道是否可能 这是我的代码 这news and season表不相关 但它们具有相似的列 我试图将其放入一个对象中以便于分页 是否可以 search r
  • Facebook iFrame 应用程序 - 摆脱垂直滚动条?

    我已经转换了一个 Facebook 应用程序 http apps facebook com video preferans 从 FBML 到 iFrame 使用 PHP SDK 现在显示的垂直滚动条与我之前显示的内容数量相同 一个徽标 一个
  • Laravel 从 API 响应中删除标头值

    Laravel 应用程序版本 5 6 我希望从 API 响应中显示的 Cache Control 标头中删除 private 值 我有一个中间件添加 无缓存 和 无存储 值 response next request response gt
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • Laravel/00webhost 错误 404。在此服务器上找不到请求的 URL

    1 将我的文件上传到 000webhost 我将公用文件夹中的所有文件放置到公共 html然后我创建了一个名为laravel我在那里上传了所有其他文件 这是我的目录结构 laravel app 引导程序 config 公共 html 索引
  • Laravel 登录后重定向回来

    登录后如何重定向返回页面 在 Laravel 5 2 中 认证控制器 protected redirectTo 重定向用户
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • 使用 yum 和 pear 安装 php-soap 均失败

    我正在尝试在 Centos 6 4 服务器上安装 PHP 的 SOAP 扩展 我对包管理器 从 CLI 安装包并在 PHP 中配置它们相当不熟悉 我相当有能力管理 php ini 和其他 PHP 配置文件 soap ini 等 我尝试使用以
  • ACL授权失败后ZF3重定向

    我有一个带有 ACL 的新 ZF3 应用程序 现在 我需要在未经授权的访问的情况下重定向到错误页面 例如 403 我认为最好的方法是触发一个事件 然后捕获它 但我失败了 全部都在我的用户模块中Module php 摘录 namespace
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • 点击 %40 变为 %2540

    当单击包含 符号的链接时 该网址给我 40 这就是我想要的 但是一旦我点击它 一秒钟后它就在我点击后变成了 2540 单击是在电子邮件内 然后定向到网站 其中 40 更改为 2540 我怎样才能让它停止变化 它现在得到这样的参数 email
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia

随机推荐

  • mongodb如何实现数组对象求和

    原本地址 mongodb如何实现数组对象求和 mongodb在计算集合数组值时候 我们通常会想到使用 group与 sum 但是如果是数组里面多个json对象 并且还需要根据条件过滤多个对象的内容该如何处理 现在让我们来实现它 假设mong
  • 转行做Linux运维工程师,简历的项目经验应该怎么写比较好?

    转行做linux运维工程师 首先要了解linux运维要做多少事情 需要什么基础 然后根据自己的情况进行有的放矢的追踪学习 先了解下做linux运维工程师需要做的事情 1 熟悉linux命令基本操作 玩不转基本操作别的都是空中楼阁 2 熟悉t
  • PNG文件格式分析

    目录 PNG简介 PNG文件组成成分是什么 File header Chunks 关键数据块 辅助数据块 实例分析 分析下图 File header Chunks 关键数据块分析 辅助数据块分析 PNG总结 参考文献 PNG简介 PNG是2
  • C语言中内嵌汇编asm语法

    内联汇编使用 asm C 和 asm C和C 关键字声明 语法格式如下所示 内联汇编支持大部分的ARM指令 但不支持带状态转移的跳转指令 如BX和BLX 指令 asm instruction instruction 必须为单条指令 asm
  • 计算机网络课程.doc,计算机网络课程-网络教学.DOC

    计算机网络课程 网络教学 计算机网络 课程教学大纲 Computer Networks 学时 50 60 一 简要说明 计算机网络是面向电子信息工程本科专业的一门重要的专业核心课 也是计算机科学与技术专业的专业基础课 目的是使学生掌握计算机
  • visual studio community 2019安装

    新电脑装好了pycharm anaconda 打算装cuda的时候 发现要先装visual studio 下载地址在微软官网https visualstudio microsoft com zh hans 选择community 2019下
  • 利用K-means聚类算法对未标注数据分组

    k 均值算法的工作流程 首先 随机确定k个初始点作为质心 接着 将数据集中的每个点分配到一个簇中 即为每个点找到距离其最近的质心 并将其分配给该质心所对应的簇 然后 每个簇的质心更新为该簇所有点的平均值 再次重新分配数据集中所有的点 如果所
  • UE4_插件开发引用第三方库编译报错[Error C4668]

    C Program Files x86 Windows Kits 10 include 10 0 16299 0 um winioctl h 7542 error C4668 WIN32 WINNT WIN10 TH2 is not def
  • 基于 APISIX 的服务网格方案 Amesh 积极开发中!

    作者 lingsamuel API7 ai 云原生技术专家 Apache APISIX Committer 在云原生快速发展的前提下 服务网格领域也开始逐渐火热 目前阶段 大家所熟知的服务网格解决方案很多 每种产品又各有其优势 因此在面对不
  • 禁止浏览器访问某些页面

    windows下 利用php apache http代理 实现本地页面黑名单 背景 准备工作 解决方案 背景 有一个项目 需要给第三方桌面软件做二次开发 但是这个软件启动时会弹出一个页面 这个页面的权限很大 如果不禁止掉的话 会给系统安全带
  • 51Nod 1081 子段求和

    题目链接 http www 51nod com Challenge Problem html problemId 1081 include
  • linux笔记整理

    Linux基础 一 基础目录 根目录 下 bin 存放普通用户可以使用的命令 boot 存放引导程序 内核等 dev 设备文件目录 etc 配置文件目录 home 普通用户家目录 lib 库文件和内核模块存放目录 lib64 64位库 pr
  • mybatis 日期格式化

    例子 SELECT date format create date Y m d H i s date format update date Y m d FROM user Y m d H i s 带时分秒 Y m d 不带时分秒
  • 设计一个算法判断表达式中的括号是否匹配

    一 问题描述 设计一个算法判断表达式中的括号是否匹配 二 问题解答 解析 这里需要用到STL在算法设计中的应用 STL在算法设计中的应用有如下几种 存放主数据 存放临时数据 检测数据元素的唯一性 数据的排序 优先队列作为堆 因此这里需要用上
  • 安装visio报错,提示无法安装64位版本的Office,找到了以下32位程序怎么办

    今天安装Visio准备用来写系统详细说明书上面画图的结果发现居然报错 实在是我也没有装过office 试过了几个方案什么office修复助手啊 什么什么的发现卵用没有 最后解决方案 win r打开运行 输入regedit 依次到HKEY C
  • 服务器拔下内存条系统不能启动,电脑主板不能启动的解决方法

    电脑主板不能启动的解决方法 因为主板扩展槽或扩展卡有问题 导致插上显卡 声卡等扩展卡后 主板没有响应 因此造成开机无显示 例如蛮力拆装agp显卡 导致agp插槽开裂 即可造成此类故障 下面是JY135小编收集整理的电脑主板不能启动的解决方法
  • 操作系统习题整理

    操作系统习题整理 从网上和课本上汇总整理了一些操作系统相关的习题 可以作为复习资料使用 1 操作系统是一种 B A 通用软件 B 系统软件 C 应用软件 D 软件包 2 操作系统是对 C 进行管理的软件 A 软件 B 硬件 C计算机资源 D
  • replaceAll()正则表达式替换内容

    String input camelCasing input input replaceAll A Z 1 System out println input 输出结果为 camel Casing
  • Pandas rank()函数排名的用法与解释

    之前搜关于pandas rank 函数的帖子 好几个大哥都是照搬书 当然也有一些大神直接一顿操作 截图 我结合了书还有自己的理解 希望没有错误 也希望和我一样的新手能看懂 谢谢 1 rank 默认情况下 rank 通过将平均排名分配到每个组
  • thinkphp6 入门(6)--中间件是什么 怎么用

    一 什么是中间件 当客户端发送请求至服务器时 HTTP请求会经过多个中间件 最后返回响应给客户端 中间件可以 在请求到达目标控制器或动作之前对请求进行操作 可以在响应离开目标控制器或动作之前对响应进行操作 二 中间件的作用 我们可以在不修改