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

news2024/10/11 16:27:16

一、什么是中间件?

当客户端发送请求至服务器时,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/993249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】conda虚拟环境下使用pyinstaller打包程序为exe

文章目录 一、为什么要用conda虚拟环境二、pyinstaller用法2.1 安装 PyInstaller2.2 基本用法打包一个 Python 脚本2.21 打包一个 Python 项目2.22 打包选项 2.3 打包依赖项2.31 导出依赖项列表2.32 配置依赖项 2.4 自定义打包选项2.5 打包完成后的文件2.6 注意事项 三、打包示…

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候&#xff0c;会调用factory .newConnection 方法&#xff0c;这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker &#xff0c;以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…

文件上传漏洞案例

目录 1.案例一 1&#xff09;案例源码 2&#xff09;创建web.php文件 3&#xff09;使用抓包软件 2.案例二 1&#xff09;案例代码 2&#xff09; 案例分析 3&#xff09;copy命令生成图片马 4&#xff09;上传图片马到服务器 5&#xff09;解析 文件图片 3.案例三 …

Error running ‘xxx‘: Command line is too long. Shorten command line for xxxx

完整报错信息&#xff1a;Error running ArticleFreemarkerTest.test: Command line is too long. Shorten command line for ArticleFreemarkerTest.test or also for JUnit default configuration. 翻译为运行“ArticleFreemarkerTest.test”时出错&#xff0c;命令行太长。…

计网第四章(网络层)(八)

在第七节&#xff08;计网第四章&#xff08;网络层&#xff09;&#xff08;七&#xff09;_永无魇足的博客-CSDN博客&#xff09;我们总结了路由信息协议RIP。在最后我们提到了RIP协议有坏消息传的慢的问题&#xff0c;这是距离向量算法的本质决定的&#xff0c;所以这种问题…

成都青溪电商:抖店精选联盟怎么绑定?

随着抖音平台的快速发展&#xff0c;越来越多的商家希望利用抖音的流量红利来实现品牌曝光和销量增长。抖音精选联盟作为抖音平台的重要合作计划&#xff0c;为商家提供了更多的机会和资源支持。下面将详细介绍如何绑定抖店精选联盟并讨论解绑情况。 1.绑定抖店选定联盟 满足入…

蓝桥杯官网练习题(数字三角形)

题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外&a…

AlwaysUp10.5.0.93安装和使用说明

安装包 安装 解压 双击exe 点击完成&#xff0c;完成安装 安装完成自动启动程序

基于串口的BLE模组CC2640R2使用总结

之前写过蓝牙控制芯片nRF52832的一篇概述&#xff0c;里面主要记录了蓝牙的分层结构&#xff0c;需要的话可参考&#xff1a;nRF52832蓝牙概述_路溪非溪的博客-CSDN博客 这篇文章记录的是蓝牙模组的基本使用。 二者有何区别呢&#xff1f; nRF52832是一款基于蓝牙的主控芯片…

QUIC协议科普导入(一)

一&#xff1a;QUIC协议导入 QUIC是一个通用的传输层网络协议&#xff0c;最初由Google的Jim Roskind设计&#xff0c;2012年实现并部署&#xff0c;2013年随着实验范围的扩大而公开发布&#xff0c;并向IETF描述。虽然长期处于互联网草案阶段&#xff0c;但在从Chrome浏览器到…

【考研数学】高等数学第五模块 —— 级数(3,傅里叶级数)

系列文章 【考研数学】高等数学第五模块 —— 级数&#xff08;1&#xff0c;常数项级数&#xff09; 【考研数学】高等数学第五模块 —— 级数&#xff08;2&#xff0c;幂级数&#xff09; 文章目录 引言三、傅里叶级数3.1 周期为 2 π 2\pi 2π 的函数的傅里叶级数3.2 定…

VS Code输出窗口显示中文乱码的解决办法

今天用requests测试web接口&#xff0c; response的编码是utf-8&#xff0c;结果在输出窗口显示的中文乱码&#xff0c;查了很多资料&#xff0c;最终找了一个比较好解决方案 url "XXXXXX"payloadeid16331117402headers {User-Agent: Apifox/1.0.0 (https://apifox…

SpringBoot原理-自动配置-概述

自动配置 SpringBoot的自动配置就是当Spring容器启动后&#xff0c;一些配置类、bean对象就会自动存入IOC容器中&#xff0c;不需要我们手动去声明&#xff0c;从而简化了开发&#xff0c;省去了繁琐的配置操作。启动一个SpringBoot项目后&#xff0c;观察如下

CRM系统主要通过什么来提升销售业绩

我们常说的CRM就是客户关系管理系统&#xff0c;它可以收集、整理和分析客户数据&#xff0c;帮助企业深入了解客户&#xff0c;提高客户转化率。CRM还可以提供市场获客、线索分配、售后服务等功能。下面就来说说&#xff0c;CRM主要是干什么的&#xff1f; CRM主要是做以下几…

当所有行业都在数字化转型时,实体商家如何快速“破局”

当今世界&#xff0c;信息技术创新日新月异&#xff0c;数字化、网络化、智能化深入发展。 国家多次明确强调推进“数字中国”建设&#xff0c;持续促进数字技术和实体经济深度融合&#xff0c;协同推进数字产业化和产业数字化。 对于实体商家来说&#xff0c;数字化转型已经不…

Tomcat服务部署、优化及多实例实验(Nginx+Tomcat负载均衡、动静分离)

目录 1 Tomcat 1.1 tomcat 构成 1.2 什么是 servlet&#xff1f; 1.3 什么是 JSP? 1.4 Tomcat 功能组件结构 1.5 Container 结构分析 1.6 Tomcat 请求过程 2 Tomcat 服务部署 2.1 环境部署 2.1.1 ​编辑 2.1.2 设置JDK环境变量 2.2 安装启动Tomcat 2.3 优化tomca…

第4章_瑞萨MCU零基础入门系列教程之瑞萨 MCU 源码设计规范

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

使用 FastChat 运行 CodeLlama-7b-Instruct-hf

使用 FastChat 运行 CodeLlama-7b-Instruct-hf 1. 确认 FactChat 支持的 Model2. 升级依赖3. 启动 controller4. 启动 CodeLlama5. 启动 api server6. VSCode 中使用 CodeLlama 1. 确认 FactChat 支持的 Model 访问 model_support.md&#xff0c;确认 codellama/CodeLlama-7b-…

浅谈电商平台API接口能做什么电商功能应用【以淘宝电商为例】

API接口我们很多行业都需要用到。作为电商从业者&#xff0c;更是对电商平台的各种API的功能和应用了如指掌&#xff01;本文就以淘宝平台API接口&#xff0c;封装的商品详情&#xff0c;SKU等各类商品数据API接口为例&#xff0c;我们来看看API接口都能怎么应用&#xff0c;而…

SpringBoot自动配置原理及使用流程

SpringBoot自动配置原理及使用流程 SpringBoot自动配置原理 具体流程 1、导入场景 以starter-web为例 场景启动器导入了相关场景的所有依赖&#xff0c;如&#xff1a;starter-json,starter-tomcat,spring-webmvc。 每个场景启动器都引入了一个spring-boot-starter,核心场景…