首页 后端开发 php教程 PHP主|使用Slim中间件

PHP主|使用Slim中间件

Feb 24, 2025 am 09:00 AM

Slim 框架的中间件:构建强大的 PHP 微型应用

Slim 是一个功能强大的 PHP 微型框架,其中间件功能允许在应用中实现各种过滤器式服务,例如身份验证和缓存。中间件封装应用程序,并能影响应用程序的环境以及请求和响应对象。

关键要点:

  • Slim 的中间件是一个强大的特性,允许实现各种过滤器式服务,如身份验证和缓存。中间件封装应用程序,并能影响应用的环境、请求和响应对象。
  • 在 Slim 中实现中间件,需要编写一个扩展 SlimMiddleware 类并重写 call() 方法的类。此方法是中间件的入口点,可以从中返回(中断执行流程)或调用下一层。然后,中间件可以操作响应的标头和正文。
  • 使用 Slim 的 add() 方法注册 Slim 应用程序中的中间件。可以通过后续调用 add() 方法注册多个中间件。必须以与调用顺序相反的顺序添加中间件,因为新的中间件会围绕任何先前添加的中间件。中间件的配置通常通过服务的构造函数完成。

Slim 中间件的理解

Slim 文档将 Slim 应用程序比作洋葱,洋葱的每一层都是中间件。这是一个恰当的比喻。为了更好地理解它,让我们假设我们正在编写一个使用身份验证和缓存的应用程序。我们的架构可能如下所示:

PHP Master | Working with Slim Middleware

负责生成页面内容的代码被包装在几层中间件中,最重要的是身份验证逻辑和缓存逻辑。执行流程经过每一层,要么允许流向下一层,要么被转移。首先检查用户是否已通过身份验证。如果没有,则中断流程并返回 HTTP 401 状态。然后检查是否可以使用内容的缓存副本。如果是,则使用缓存的页面副本中断流程。可能存在其他中间件层,直到流程最终到达负责生成页面的逻辑。当我们的中间件方法返回时,执行流程会通过它们冒泡返回。例如,缓存中间件的其余逻辑将缓存页面的内容以供以后查找。

中间件的实现

要了解如何实现自定义中间件,让我们看看可以作为上面提到的缓存中间件的代码。实现任何基本 Slim 中间件组件的要求实际上非常少。我们只需要编写一个扩展 SlimMiddleware 类并重写 call() 方法的类。中间件的入口点是此 call() 方法,我们可以从中返回(从而中断执行流程)或调用下一层。

<?php namespace MyMiddleware;

class Cache extends SlimMiddleware
{
    protected $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function call()
    {
        $key = $this->app->request()->getResourceUri();
        $rsp = $this->app->response();

        $data = $this->fetch($key);
        if ($data) {
            // 缓存命中...返回缓存的内容
            $rsp["Content-Type"] = $data["content_type"];
            $rsp->body($data["body"]);
            return;
        }

        // 缓存未命中...继续生成页面
        $this->next->call();

        if ($rsp->status() == 200) {
            // 缓存结果以供将来查找
            $this->save($key, $rsp["Content-Type"], $rsp->body());
        }
    }

    protected function fetch($key)
    {
        $query = "SELECT content_type, body FROM cache
            WHERE key = " . $this->db->quote($key);
        $result = $this->db->query($query);
        $row = $result->fetch(PDO::FETCH_ASSOC);
        $result->closeCursor();
        return $row;
    }

    protected function save($key, $contentType, $body)
    {
        $query = sprintf("INSERT INTO cache (key, content_type, body)
            VALUES (%s, %s, %s)",
            $this->db->quote($key),
            $this->db->quote($contentType),
            $this->db->quote($body)
        );
        $this->db->query($query);
    }

}

call() 方法首先检查内容是否在缓存中可用。如果是,它设置响应的 Content-Type 标头和正文,然后返回,从而短路管道。如果缓存未命中,则调用 $this->next->call() 来调用下一个中间件层。当流程从其他中间件调用返回到这一点时,会快速检查请求状态,并将相关数据缓存以供将来查找。因为该类扩展了 Slim 的 Middleware 类,所以它可以通过 $this->app 访问 Slim 应用程序的实例,从而间接访问响应和请求对象。我们可以通过将其视为数组来影响响应的标头,并通过其 body() 方法影响响应的正文。fetch()save() 方法是受保护的辅助方法,它们只是包装数据库查询以查找和持久化内容。我在这里包含它们只是为了完成示例。它假设存在一个名为 cache 的表,其中包含 keycontent_typebody 列。根据您的需要,您的持久性机制可能有所不同。此外,此处未显示(为简单起见)缓存过期,尽管您可以自己轻松地合并它。

中间件的注册和配置

使用 Slim 的 add() 方法注册中间件。

<?php require_once "../vendor/autoload.php";

$app = new SlimSlim();
$app->add(new MyMiddlewareCache($db));

当然,可以通过后续调用 add() 方法注册多个中间件。因为新的中间件会围绕任何先前添加的中间件,这意味着必须以与调用顺序相反的顺序添加它们。

<?php $app = new SlimSlim();
$app->add(new MyMiddlewareCache($db));
$app->add(new MyMiddlewareAuth($db));
// ...

在上面的示例中,Cache 中间件包装了 Slim 应用,然后 Auth 中间件包装了 Cache。当调用 $app->run() 时,执行流程将类似于上图所示,首先进入身份验证中间件,然后一直向下工作到路由。中间件的配置通常通过服务的构造函数完成。在我们的示例中,我只是传递了一个活动的数据库连接,以便它可以访问缓存表,但是您可以编写您的类以接受您可能需要自定义其行为的任何信息。例如,可以重写该组件以接受一个公开 fetch()save() 方法的处理程序对象;这将允许我们删除示例方法(或将它们用作默认回退),并且最终用户开发人员将根据其需求提供功能作为组件配置的一部分。

结论

我发现中间件是实现 Slim 应用程序各个方面的优雅解决方案。在本文中,我解释了中间件架构的工作原理以及实现自己的中间件所需的条件。有一个小型额外存储库,其中包含一些基本的中间件示例,例如 CSRF 保护和 HTTP 身份验证。我已经重构了这里的示例并提交了一个拉取请求,因此,如果您编写了一个有用的中间件服务,为什么不考虑将其提交到项目中,以便其他人也能从中受益呢?

(图片来自 Fotolia)

(以下为FAQ,已根据原文内容调整和补充,并精简部分重复内容)

关于 Slim 中间件的常见问题

  • 什么是 Slim 中间件,为什么它很重要? Slim 中间件是 Slim 框架中一个强大的工具,允许您操作 HTTP 请求和响应。它很重要,因为它提供了一种在 Slim 应用程序之前和之后执行代码的方法,以修改传入的请求或传出的响应。这可用于各种目的,例如身份验证、缓存或日志记录。

  • 如何在 Slim 中创建中间件? 在 Slim 中创建中间件涉及定义一个实现 MiddlewareInterface 的类。此类应该有一个名为 process() 的方法,该方法接收 ServerRequestInterfaceRequestHandlerInterfaceprocess() 方法是您可以操作请求和响应的地方。

  • 如何将中间件添加到我的 Slim 应用程序? 可以使用 add() 方法将中间件添加到您的 Slim 应用程序。此方法接收中间件类的实例。中间件按添加顺序执行,因此最后添加的中间件将是第一个执行的中间件。

  • 我可以将中间件用于 Slim 中的特定路由吗? 是的,中间件可以应用于 Slim 中的特定路由。这是通过在 Route 对象而不是 App 对象上调用 add() 方法来完成的。这允许您拥有仅影响某些路由的中间件。

  • 全局中间件和路由中间件有什么区别? 全局中间件应用于 Slim 应用程序处理的每个请求,而路由中间件仅应用于特定路由。这允许您为应用程序的不同部分使用不同的中间件。

  • 如何使用中间件进行 Slim 中的错误处理? 通过在中间件类中捕获异常,可以使用中间件进行 Slim 中的错误处理。然后,您可以修改响应以包含错误信息,或将用户重定向到错误页面。

  • 可以使用中间件在 Slim 中对用户进行身份验证吗? 是的,中间件通常用于 Slim 中的身份验证。这可以通过检查中间件中的有效会话或令牌来完成,如果用户未经身份验证,则返回错误响应。

  • 如何使用中间件在 Slim 中进行日志记录? 通过将有关请求和响应的信息写入日志文件,可以使用中间件进行日志记录。这对于调试或监视您的应用程序非常有用。

  • 我可以将第三方中间件与 Slim 一起使用吗? 是的,Slim 支持第三方中间件。这可以像您自己的中间件一样添加到您的应用程序中。这允许您利用现有的中间件来完成常见任务。

  • 如何测试我的 Slim 中间件? 测试 Slim 中间件涉及创建模拟请求和响应,并将它们传递给您的中间件。然后,您可以断言中间件的行为符合预期,例如修改请求或响应,或抛出异常。

以上是PHP主|使用Slim中间件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何设置PHP时区? 如何设置PHP时区? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

编写清洁和可维护的PHP代码的最佳实践是什么? 编写清洁和可维护的PHP代码的最佳实践是什么? Jun 24, 2025 am 12:53 AM

写干净、易维护的PHP代码关键在于清晰命名、遵循标准、合理结构、善用注释和可测试性。1.使用明确的变量、函数和类名,如$userData和calculateTotalPrice();2.遵循PSR-12标准统一代码风格;3.按职责拆分代码结构,使用MVC或Laravel式目录组织;4.避免面条式代码,将逻辑拆分为单一职责的小函数;5.在关键处添加注释并撰写接口文档,明确参数、返回值和异常;6.提高可测试性,采用依赖注入、减少全局状态和静态方法。这些做法提升代码质量、协作效率和后期维护便利性。

如何使用PHP执行SQL查询? 如何使用PHP执行SQL查询? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

如何快速测试PHP代码片段? 如何快速测试PHP代码片段? Jun 25, 2025 am 12:58 AM

toquicklytestaphpcodesnippet,useanonlinephpsandboxlike3v4l.orgorphpize.onlineforinstantantantExecutionWithOutSetup; runco​​delocalocallocallocallocallocallocallywithpplibycreatinga.phpfileandexecutingitviateringitviatheterminal;

如何在PHP中使用页面缓存? 如何在PHP中使用页面缓存? Jun 24, 2025 am 12:50 AM

PHP页面缓存可通过减少服务器负载和加快页面加载速度提升网站性能。1.基本文件缓存通过生成静态HTML文件并在有效期内提供服务,避免重复生成动态内容;2.启用OPcache可将PHP脚本编译为字节码存储在内存中,提升执行效率;3.对带参数的动态页面,应根据URL参数分别缓存,并避免缓存用户特定内容;4.可使用轻量级缓存库如PHPFastCache简化开发并支持多种存储驱动。结合这些方法能有效优化PHP项目的缓存策略。

如何升级PHP版本? 如何升级PHP版本? Jun 27, 2025 am 02:14 AM

升级PHP版本其实不难,但关键在于操作步骤和注意事项。以下是具体方法:1.确认当前PHP版本及运行环境,使用命令行或phpinfo.php文件查看;2.选择适合的新版本并安装,推荐8.2或8.1,Linux用户用包管理器安装,macOS用户用Homebrew;3.迁移配置文件和扩展,更新php.ini并安装必要扩展;4.测试网站是否正常运行,检查错误日志确保无兼容性问题。按照这些步骤操作,大多数情况都能顺利完成升级。

PHP初学者指南:当地环境配置的详细说明 PHP初学者指南:当地环境配置的详细说明 Jun 27, 2025 am 02:09 AM

要设置PHP开发环境,需选择合适的工具并正确安装配置。①最基础的PHP本地环境需要三个组件:Web服务器(Apache或Nginx)、PHP本身和数据库(如MySQL/MariaDB);②推荐初学者使用集成包如XAMPP或MAMP,它们简化了安装流程,XAMPP适用于Windows和macOS,安装后将项目文件放入htdocs目录并通过localhost访问;③MAMP适合Mac用户,支持便捷切换PHP版本,但免费版功能有限;④高级用户可用Homebrew手动安装,在macOS/Linux系统中

在Linux上配置PHP开发环境的步骤 在Linux上配置PHP开发环境的步骤 Jun 30, 2025 am 01:57 AM

TosetupaPHPdevelopmentenvironmentonLinux,installPHPandrequiredextensions,setupawebserverlikeApacheorNginx,testwithaPHPfile,andoptionallyinstallMySQLandComposer.1.InstallPHPandextensionsviapackagemanager(e.g.,sudoaptinstallphpphp-mysqlphp-curlphp-mbst

See all articles