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

【PHP】ThinkPHP6中间件介绍

CrazyPanda发表于:2024-07-29 11:06:05浏览:250次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】tp使用lunar-php,获取节日节气
lunar-php 是一个用于获取公历和农历(即阳历和阴历)信息的 PHP 库。要使用 lunar-php 获取节日和节气,你需要先安装这个库。&nbsp;首先,通过 Composer 安装 lunar-php:composer&nbsp;require&nbsp;chenmingl/lunar-php获取阳历阴历节日及节气:require&nbsp;&#39;vendor/autoload.php&#39;; &nbsp; use&nbsp;Lunar\Lunar; &nbsp; //&amp;nbs
发表于:2024-04-09 浏览:310 TAG:
【PHP】ThinkPHP5.0 Restful API 开发
一、要学习什么是 RESTful API 首先我们得明白什么是REST?简单来说:REST是所有Web应用都应该遵守的架构设计指导原则。 英文全词Representational State Transfer,翻译是”表现层状态转化”。面向资源 是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。(7个HTTP方法:GET
发表于:2024-05-24 浏览:242 TAG:
【PHP】MongoDB介绍
MongoDBA是一个开源的、面向文档的NoSQLA数据库,它提供了高性能、可扩展的数据存储解决方案。MongoDB支持动态查询、高可用性、自动分片等功能,使其成为处理大规模数据集的优选数据库。MongoDB的核心特性包括:面向集合存储:数据被分组存储在集合中,集合类似于RDBMS中的表,但提供了更高的灵活性和无模式存储。无模式结构:存储在集合中的数据是无模式的,即每个文档可以有不同的字段和值类型,这为用户提供了极大的灵活性。高性能:MongoDB利用内存中的数据缓存来提高性能,并支持数据的
发表于:2024-05-28 浏览:283 TAG:
【PHP】workerman-jsonRpc 与 thinkphp6结合 的方法
1.下载workerman-jsonRpc的包2.将包内 vendor / workerman 下的内容放进tp的vendor目录下并加载(我先用composer装了GatewayWorker,然后把文件覆盖进去了) 3.创建一个tp的命令行,并给这个命令行添加2个自定义参数 4.将workerman-jsonrpc根目录下的start.php内容复制到你创建的命令行类的执行方法里,并把引入vendor那行删掉 5.打开workerman扩展的目录,找到Worker.php类文件 找到其中的
发表于:2024-05-27 浏览:280 TAG:
【PHP】PHP8如何通过Sanitize Filters来增强应用程序的安全性
PHP是一门广泛应用于Web开发的脚本语言,而安全性一直是Web应用程序开发者需要关注的重要问题。PHP8提供了一种称为Sanitize Filters的机制,通过对用户输入进行过滤和清理,可以增强应用程序的安全性。本文将详细介绍PHP8中Sanitize Filters的使用方法,并提供一些具体的代码示例,帮助开发者更好地了解如何应用这一特性。首先,让我们来了解一下Sanitize Filters是什么。Sanitize Filters是一组用于过滤和清理用户输入数据的PHP函数,可以帮助开发
发表于:2023-12-30 浏览:278 TAG:
【PHP】php判断字符串是否含有日文字符
可以使用PHP的正则表达式函数preg_match()来检测字符串上的日文字符。以下是一个例子:$str&nbsp;=&nbsp;&quot;こんにちは、世界!&quot;; if&nbsp;(preg_match(&#39;/\p{Hiragana}|\p{Katakana}|\p{Han}/u&#39;,&nbsp;$str))&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;字符串包含日文字符。&quot;; } &nbsp;else&amp;nbs
发表于:2023-12-13 浏览:299 TAG:
【PHP】php中?:与??运算符有什么不同?
在PHP 7中,有两个类似的语法结构:“??”和“?:”,它们都是用于处理条件判断和返回值的运算符。尽管它们看起来相似,但它们的作用和用法有一些区别。&quot;?:&quot;是三目运算符,语法格式为:$result = $test ? $test : ′ ′ ; 意思就是当test存在时(即empty($test)为false),则返回它本身,否则返回空(当然也可以返回其他,这里的空只是举个例子)。&quot;??&quot;是php7新引入的语法,它相当于是isset($result[‘k
发表于:2024-08-01 浏览:272 TAG:
【PHP】CI,ThinkPHP,YII,Laravel框架比较
用过其中的yii TP CI框架。大概整理了这些框架的优点和缺点,有些错误的地方还希望大家指正。各个框架各有所长,针对的应用场景不同。一、Ci框架推崇简单就是美这一原则,没有花哨的设计模式,没有华丽的对象结构,一切就是那么简单。优点:框架的入门槛很低,极易学,极易用,框架很小,静态化非常容易配置简单,全部的配置使用php脚本来配置,执行效率高缺点:架构略简单,只能满足小型应用,略微不太能够满足中型应用需要大型项目扩展能力差,有些功能需要自己写扩展数据库类的扩展 ci给用户提供了一个名为call_
发表于:2024-07-14 浏览:303 TAG: #php #框架
【PHP】ThinkPHP如何防止SQL注入攻击
在ThinkPHP中,参数绑定是一种安全的方式,用于处理用户输入,特别是在构建数据库查询时。参数绑定可以防止SQL注入攻击,因为绑定的参数会被自动转义,而不是直接插入到SQL语句中。以下是在ThinkPHP中使用参数绑定的一些建议。1. 控制器中的参数绑定:在控制器中,可以使用bind方法进行参数绑定。以下是一个简单的示例:public&nbsp;function&nbsp;index($id) { &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;Db::
发表于:2024-01-04 浏览:325 TAG:
【PHP】用PHP从数据库到后端到前端完整实现一个中秋节祝福语项目
文章目录🚀一、前言🚀二、开发环境准备🚀三、功能实现🍁3.3.1 HTML布局🍁3.3.2 JQuery事件处理🍁3.2.1 连接数据库🍁3.2.1 获取祝福语🍁3.2.3 处理请求🍁3.2.4 配置Nginx与FPM🍁3.1.1 创建数据库及表结构🍁3.1.2 准备数据🔎3.1 准备数据库和数据🔎3.2 后端开发🔎3.3 前端开发🚀四、运行和测试🔎4.1 绑定host🔎4.2 开始测试🚀五、总结中秋佳节即将来临!在这特殊的时刻,我们特别举办一场属于程序员的中秋
发表于:2023-12-06 浏览:439 TAG: