Slim 框架的中间件:构建强大的 PHP 微型应用
Slim 是一个功能强大的 PHP 微型框架,其中间件功能允许在应用中实现各种过滤器式服务,例如身份验证和缓存。中间件封装应用程序,并能影响应用程序的环境以及请求和响应对象。
关键要点:
SlimMiddleware
类并重写 call()
方法的类。此方法是中间件的入口点,可以从中返回(中断执行流程)或调用下一层。然后,中间件可以操作响应的标头和正文。add()
方法注册 Slim 应用程序中的中间件。可以通过后续调用 add()
方法注册多个中间件。必须以与调用顺序相反的顺序添加中间件,因为新的中间件会围绕任何先前添加的中间件。中间件的配置通常通过服务的构造函数完成。Slim 中间件的理解
Slim 文档将 Slim 应用程序比作洋葱,洋葱的每一层都是中间件。这是一个恰当的比喻。为了更好地理解它,让我们假设我们正在编写一个使用身份验证和缓存的应用程序。我们的架构可能如下所示:
负责生成页面内容的代码被包装在几层中间件中,最重要的是身份验证逻辑和缓存逻辑。执行流程经过每一层,要么允许流向下一层,要么被转移。首先检查用户是否已通过身份验证。如果没有,则中断流程并返回 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
的表,其中包含 key
、content_type
和 body
列。根据您的需要,您的持久性机制可能有所不同。此外,此处未显示(为简单起见)缓存过期,尽管您可以自己轻松地合并它。
中间件的注册和配置
使用 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()
的方法,该方法接收 ServerRequestInterface
和 RequestHandlerInterface
。process()
方法是您可以操作请求和响应的地方。
如何将中间件添加到我的 Slim 应用程序? 可以使用 add()
方法将中间件添加到您的 Slim 应用程序。此方法接收中间件类的实例。中间件按添加顺序执行,因此最后添加的中间件将是第一个执行的中间件。
我可以将中间件用于 Slim 中的特定路由吗? 是的,中间件可以应用于 Slim 中的特定路由。这是通过在 Route
对象而不是 App
对象上调用 add()
方法来完成的。这允许您拥有仅影响某些路由的中间件。
全局中间件和路由中间件有什么区别? 全局中间件应用于 Slim 应用程序处理的每个请求,而路由中间件仅应用于特定路由。这允许您为应用程序的不同部分使用不同的中间件。
如何使用中间件进行 Slim 中的错误处理? 通过在中间件类中捕获异常,可以使用中间件进行 Slim 中的错误处理。然后,您可以修改响应以包含错误信息,或将用户重定向到错误页面。
可以使用中间件在 Slim 中对用户进行身份验证吗? 是的,中间件通常用于 Slim 中的身份验证。这可以通过检查中间件中的有效会话或令牌来完成,如果用户未经身份验证,则返回错误响应。
如何使用中间件在 Slim 中进行日志记录? 通过将有关请求和响应的信息写入日志文件,可以使用中间件进行日志记录。这对于调试或监视您的应用程序非常有用。
我可以将第三方中间件与 Slim 一起使用吗? 是的,Slim 支持第三方中间件。这可以像您自己的中间件一样添加到您的应用程序中。这允许您利用现有的中间件来完成常见任务。
如何测试我的 Slim 中间件? 测试 Slim 中间件涉及创建模拟请求和响应,并将它们传递给您的中间件。然后,您可以断言中间件的行为符合预期,例如修改请求或响应,或抛出异常。
以上是PHP主|使用Slim中间件的详细内容。更多信息请关注PHP中文网其他相关文章!