1.5.2 版本发布
Slim Framework v1.5.2 引入了新的架构。其他一些功能也已变更并进行改进。这是一个重大更新,当前被视为测试版。使用此版本需自行承担风险。它将保留在开发分支,直到用户有足够时间使用新版本测试其应用程序。
更新:我在下面描述的 1.5.2 版本将标记为 1.6.0 版本。你可以在较新的博客文章“版本号”中了解有关此变更的更多信息。
下面显示的大多数变更都是“底层的”。公共接口在没有另行说明的情况下基本上保持不变。我鼓励你阅读开发分支文档,以探索 1.5.2 版本中的新功能。
Rack 架构
虽然面向 PHP 5 的 Slim Framework 在外部看起来保持不变,但该框架采用了全新的基于 Rack 的架构,并从头到尾支持 Rack 协议。
环境
应用程序环境现已与 Slim_Http_Request 类解耦,并移到了 Slim_Environment 类中。这样,Slim_Http_Request 和 Slim_Http_Response 类可以成为当前环境的独立抽象,而不是之前作为全应用程序单例。Slim_Environment 类会解析 Rack 协议规范中定义的环境变量,并向 Slim 应用程序及其中间件提供这些变量。
中间件
通过新的 Rack 架构,Slim Framework 现在支持中间件。中间件允许你在调用 Slim 应用程序之前和/或之后操纵当前环境变量和/或 HTTP 请求。你可以将 Slim 应用程序视作洋葱核。像食人魔一样,洋葱也有很多层。洋葱的每一层都是一个中间件。当你调用 Slim 应用程序的 run() 方法时,最外层的中间件层将首先被调用。调用成功后,该中间件负责调用它所包围的下一个中间件层(或 Slim 应用程序)。此过程会深入洋葱,通过每一层中间件,直到调用 Slim 应用程序核为止。
每个中间件都将实现一个 call()
公共实例方法。此方法会将其一个且唯一的参数接受为对当前环境数组的引用。call()
方法应该执行适当的操作,然后可以调用下游的中间件或 Slim 应用程序。此方法必须返回一个数组,其中包含 HTTP 状态、HTTP 标头和 HTTP 正文。状态是一个整数。HTTP 标头是一个可迭代的数据结构:Slim_Http_Headers 的实例或关联数组。正文是一个字符串。
测试
由于将环境变量从 Slim_Http_Request 类中分离出来,测试 Slim 应用程序也变得更加容易。Slim_Environment 类负责从 $_SERVER 超全局变量中解析环境变量,它提供了一个 mock() 公共实例方法,让你可以自行定义环境变量。这让你可以构建模拟 HTTP 请求来测试 Slim 应用程序。
HTTP Cookie
以前的 Slim 框架版本依赖于 PHP 本地的 setcookie()
函数,以通过 HTTP 响应发送 HTTP Cookie。1.5.2 版本使用自己的实现来构建 Set-Cookie
标头,这使中间件能够在标头传递到客户端之前检查并处理原始标头。
由于 1.5.2 版本使用自己的底层 Cookie 实现,因此使用 PHP < 5.2 的用户现在可以使用 Set-Cookie
标头的“HttpOnly”参数;这在 PHP 本地的 setcookie()
方法中是不可能的。
会话
在早期版本的 Slim 框架中,会话使用的是一刀切的方法。但是,1.5.2 版本不会自动启动 PHP 会话。如果你想使用 PHP 会话,你必须自行配置和启动 PHP 会话。
早期的版本还提供了存储在哈希、加密 HTTP Cookie 中的安全会话。这种功能已经从核心框架中提取出来,变成可选的中间件。若要使用保存在 HTTP Cookie 中的安全会话,请将 Slim_Middleware_SessionCookie 中间件添加到你的应用程序。在使用安全会话 Cookie 中间件时,你将继续使用 $_SESSION
超全局变量,但不需要启动本地 PHP 会话。这样,你可以在本地 PHP 会话和会话 Cookie 中间件之间轻松迁移,且无需更改应用程序代码。当你添加 Slim_Middleware_SessionCookie 中间件时,你可以选择指定它的到期时间、路径、域、安全性和 HttpOnly Cookie 属性,以及 Cookie 加密的密码、密码模式和密钥。这些属性与 Slim 应用程序的 Cookie 属性是分开的。
日志记录
Slim 框架的日志记录也已与之前的版本不同。在 1.5.2 版本中,有一个 Slim_Log 类,它实现了与之前相同的公共实例方法
$log = $app->getLog();
$app->debug();
$app->info();
$app->warn();
$app->error();
$app->fatal();
与早期版本不同,Slim_Log 实例使用日志记录器。日志记录器实现了公共 write()
实例方法,该方法接受混合参数,并将参数写入适当的输出。日志记录器可以将日志消息发送到 stderr、文件、数据库、Twitter、远程 API 或其他任何你能想象到的位置。自定义 Slim 应用程序日志记录的推荐方法是创建一个自定义日志记录器,这样 Slim 的 Slim_Log 实例将使用它而不是自己的日志记录器。Slim 的默认日志记录器会将日志消息发送到 php://stderr
。
HTTP 请求和响应
Slim_Http_Request 和 Slim_Http_Response 对象现在是幂等抽象,而不是应用范围内的单例。每个 Slim 应用将默认具有请求和响应对象,但您可以根据需要在钩子或中间件中对其进行实例化,以便轻松创建或修改 HTTP 请求和响应。
这些类现在还提供了许多新的帮助器方法,以帮助您更轻松地检查 HTTP 请求和响应属性。我鼓励您浏览这两个类的源代码以了解可用方法。
钩子和过滤器
中间件允许您对 Slim 应用执行操作。钩子允许您在 Slim 应用的特定点执行操作。钩子的行为与早期版本中完全相同。但是,版本 1.5.2 移除了过滤器。尽管在早期版本中实现了过滤器基础结构,但从未创建或使用过任何默认过滤器。随着 Slim 中间件的引入,过滤器在很大程度上已过时。如果您需要过滤 HTTP 请求或响应属性,请在中间件中执行此操作。
测试覆盖率
为了适应新的 Rack 架构,大多数单元测试都已使用模拟环境重新编写。模拟环境帮助我将测试覆盖率提高到了 98% 左右。这将继续得到改善。