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

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
解释负载平衡如何影响会话管理以及如何解决。解释负载平衡如何影响会话管理以及如何解决。Apr 29, 2025 am 12:42 AM

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

说明会话锁定的概念。说明会话锁定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP会议的选择吗?有其他PHP会议的选择吗?Apr 29, 2025 am 12:36 AM

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

在PHP的上下文中定义'会话劫持”一词。在PHP的上下文中定义'会话劫持”一词。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

PHP的完整形式是什么?PHP的完整形式是什么?Apr 28, 2025 pm 04:58 PM

文章讨论了PHP,详细介绍了其完整形式,在We​​b开发中的主要用途,与Python和Java的比较以及对初学者的学习便利性。

PHP如何处理形式数据?PHP如何处理形式数据?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _获取超级全局的php处理数据,并通过验证,消毒和安全数据库交互确保安全性。

PHP和ASP.NET有什么区别?PHP和ASP.NET有什么区别?Apr 28, 2025 pm 04:56 PM

本文比较了PHP和ASP.NET,重点是它们对大规模Web应用程序,性能差异和安全功能的适用性。两者对于大型项目都是可行的,但是PHP是开源和无关的,而ASP.NET,

PHP是对病例敏感的语言吗?PHP是对病例敏感的语言吗?Apr 28, 2025 pm 04:55 PM

PHP的情况敏感性各不相同:功能不敏感,而变量和类是敏感的。最佳实践包括一致的命名和使用对案例不敏感的功能进行比较。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

禅工作室 13.0.1

禅工作室 13.0.1

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

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),