您的当前位置:首页>全部文章>文章详情

【PHP】ThinkPHP6中间件介绍

CrazyPanda发表于:2024-07-29 11:06:05浏览:258次TAG: #php #thinkphp #中间件

一、什么是中间件?

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

4. 控制器中间件

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

图片

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

图片

可以通过“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')

六、中间件向控制器传参

<?php
 
namespace app\middleware;
 
class Hello
{
    public function handle($request, \Closure $next)
{
        $request->hello = 'ThinkPHP';
        
        return $next($request);
    }
}

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

public function index(Request $request)

参考:

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

猜你喜欢

【PHP】php网络服务器有哪些软件
php网络服务器有Apache HTTP Server、Nginx、Microsoft Internet Information Services、Lighttpd和Caddy等。详细介绍:1、Apache HTTP Server,Apache是最流行的开源Web服务器软件之一,广泛应用于PHP开发,它稳定、可靠,支持多平台,具有丰富的功能和灵活的配置选项;2、Nginx等等。本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。在PHP开发中,常用的网络
发表于:2023-12-04 浏览:564 TAG:
【PHP】php7弃用的函数有哪些
本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。PHP 7是PHP编程语言的一个重要版本,引入了许多新特性和改进。同时,为了提高代码的质量和安全性,PHP 7还废弃了一些旧的函数。下面是一些在PHP 7中被弃用的函数的例子:1. mysql_ 系列函数:在PHP 7中,mysql_ 系列函数(如mysql_connect、mysql_query等)被弃用。这些函数是用于与MySQL数据库进行交互的旧API,而在PHP 5.5版本中已经引入了更现代化和安全的my
发表于:2024-08-02 浏览:283 TAG: #php
【PHP】设计模式的六大原则
设计模式的六大原则是指导软件开发设计的核心原则,它们帮助开发人员创建可维护、可扩展和灵活的软件系统。这些原则包括:&nbsp;‌&nbsp;&nbsp;&nbsp;&nbsp;单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这有助于减少类与类之间的耦合,提高类的内聚性和可读性。&nbsp;‌&nbsp;&nbsp;&nbsp;&nbsp;开闭原则(Open-Closed Principle, OCP):软件实体(如类、
发表于:2024-07-16 浏览:281 TAG:
【PHP】PHP设计模式大全与应用场景
面向对象编程的基本原则:1、单一职责:一个类,只需要做好一件事情。2、开放封闭:一个类,应该是可扩展的,而不可修改的。3、依赖倒置:一个类,不应该强依赖另外一个类。每个类对于另外一个类都是可替换的。4、配置化:尽可能的使用配置,而不是硬编码。5、面向接口编程:只需要关心接口,不需要关心实现。1、单例设计模式所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中!单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接。一个单例类应具
发表于:2024-06-22 浏览:259 TAG: #php
【PHP】php8和php7哪个好
PHP8相较于PHP7在性能、新特性和语法改进、类型系统、错误处理和扩展等方面都有一些优势和改进。然而,选择使用哪个版本要根据具体的需求和项目情况来决定。详细介绍:1、性能提升,PHP8引入了Just-in-Time(JIT)编译器,可以提高代码的执行速度;2、新特性和语法改进,PHP8支持命名参数和可选参数的声明,使得函数调用更加灵活;引入了匿名类、属性的类型声明等等。【程序员必备开发工具推荐】Apifox一款免费API管理工具Apifox = Postman + Swagger +
发表于:2023-12-04 浏览:608 TAG:
【PHP】如何在PHP中使用Imagick库处理图片?
引言:在Web开发中,经常需要对图片进行处理和优化,Imagick是一个强大的PHP扩展库,可以实现各种图片处理操作,比如图片裁剪、缩放、旋转、添加文字等。本文将介绍如何使用Imagick库在PHP中处理图片,并给出具体的代码示例。一、安装Imagick库1.确认是否已安装Imagick库在终端中输入以下命令,查看是否已安装Imagick库:php&nbsp;-m&nbsp;|&nbsp;grep&nbsp;imagic登录后复制登录后复制如果没有输出,则说明未安装Imagick库,需要进行安装
发表于:2024-03-25 浏览:359 TAG:
【PHP】步骤详解Centos中编译安装php8与配置方法
本篇文章给大家带来了关于php的相关知识,其中主要介绍了在Centos系统中是如何编译安装php,以及如何正确配置的,步骤很详细!感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面。准备工
发表于:2024-01-06 浏览:339 TAG:
【PHP】如何在PHP中使用ReactPHP进行异步操作和事件驱动开发
随着 web 应用的复杂度不断提高,对性能和高并发的要求也越来越高。php 作为一门广泛应用于 web 开发的语言,也需要紧跟时代步伐,提供更高效、更灵活的解决方案。而 reactphp 正是针对 php 的高性能、事件驱动的异步解决方案。在本篇文章中,我们将讨论如何在 php 中使用 reactphp 进行异步操作和事件驱动开发,以提升 web 应用的性能和用户体验。什么是 ReactPHPReactPHP 是基于 PHP 的事件驱动的异步解决方案,它使用非阻塞 I/O 和事件循环,将 PHP
发表于:2024-04-14 浏览:353 TAG:
【PHP】Your requirements could not be resolved to an installable set of packages.
执行composer&nbsp;install遇到错误:Your requirements could not be resolved to an installable set of packages. 这是因为不匹配composer.json要求的版本,错误代码如下。Your&nbsp;requirements&nbsp;could&nbsp;not&nbsp;be&nbsp;resolved&nbsp;to&nbsp;an&nbsp;installable&nbsp;set&nbsp;of
发表于:2024-02-08 浏览:324 TAG:
【PHP】PHP8 新特性 match 表达式详解
PHP8 alpha2发布了,最近引入了一个新的关键字:match, 这个关键字的作用跟switch有点类似。这个我觉得还是有点意思,match这个词也挺好看,那么它是干啥的呢?在以前我们可能会经常使用switch做值转换类的工作,类似:function&nbsp;convert($input)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;($input)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
发表于:2024-01-03 浏览:304 TAG: