版本 2.3.0 的 Slim 框架
Slim 框架在版本 2.3.0 中包含很多新颖有用的功能。它向下兼容上一个版本。在我更新官方文档时,这里有一些提示帮助你开始使用 Slim 的新功能。
路由组
现在可以对路由进行分组。这帮助你避免在每个路由定义中复制路由的 URL 前缀(例如,“/api/users”)。
/**
* API route group
*/
$app->group('/api', function () use ($app) {
/**
* User route group
*/
$app->group('/users', function () use ($app) {
/**
* New user --> GET /api/users/new
*/
$app->get('/new', function () use ($app) {
$app->render('new_user.html');
});
});
/**
* Role route group
*/
$app->group('/roles', function () use ($app) {
/**
* New role --> GET /api/roles/new
*/
$app->get('/new', function () use ($app) {
$app->render('new_role.html');
});
});
});
资源定位器
Slim 现在提供一个资源定位器。这项功能让你可以轻松地将对象注入到一个 Slim 应用程序或者快速修改 Slim 应用程序包含的内容(例如,请求对象)。
你可以使用资源定位器将任何资源注入到一个 Slim 应用程序。
// Set value
$app->foo = 'bar';
// Get value
$value = $app->foo;
You can also inject a resource as a closure that will be invoked whenever the given resource is requested.
// Set value
$app->now = function () {
return time();
};
// Get value
$now = $app->now;
如果你将一种资源注入作为闭包执行,那么它每次在请求该资源时都会被调用。如果你需要计算该资源仅一次然后每次请求时保持不变(即单例),那么你需要执行以下操作
// Set singleton value
$app->container->singleton('db', function () {
return new PDO('sqlite:database.db');
});
// Get singleton value
$pdo = $app->db;
Slim 的很多内部对象(例如 Environment、Request、Response、View、Log)都使用上述演示的单例方法来注入。你可以轻松地覆盖 Slim 为这些对象定义的任何默认实现。
$app = new \Slim\Slim();
// Override Slim's default Response object
$app->container->singleton('response', function () {
return new \My\Response();
});
Slim 现在会为你自己的自定义 \My\Response 类使用它自己的 Response 内部对象。Slim 目前不会编纂其内部对象的预期接口;如果你打算覆盖任何 Slim 内部对象,我建议你使用子类扩展内部对象。下一个发布要点将编纂 Slim 与接口的预期行为,让你在覆盖 Slim 的默认内部对象时有更大的灵活性。
访问器
因为 Slim 使用一个资源定位器,所以现在可以通过在 Slim 应用程序的实例上设置公开属性来直接访问内部应用程序对象(例如 Request 和 Response)。以前你依赖于诸如 request() 和 response() 等访问器方法。现在你可以直接做
$app = new \Slim\Slim();
$app->get('/', function () use ($app) {
// Get environment
$env = $app->environment;
// Get request
$req = $app->request;
// Get response
$res = $app->response;
// Get view
$view = $app->view;
// Get log
$log = $app->log;
});
设置接口
版本 2.3.0 包含一个新的 \Slim\Helper\Set 接口。此接口简化并标准化了你与 Slim 应用程序集合交互的方式,例如 Request 和 Response 对象上的 Cookie 和标题。该接口是
set($key, mixed $value);
get($key, mixed $defaultValue = null);
replace(array $items);
all();
keys();
has($key);
remove($key);
clear();
count();
\Slim\Helper\Set 类还实现了 ArrayAccess、Countable 和 IteratorAggregate 接口。
标题
Request 和 Response 对象均包含一个公开的 headers 属性。此属性是 \Slim\Helper\Set 的一个实例。此接口让你可以轻松地抓取 Request 对象的标题,如下所示
$headers = $app->request->headers->all();
$header = $app->request->headers->get('Content-Type');
你也可以轻松地操纵 Response 对象上的标题,如下所示
$app->response->headers->set('X-Foo', 'Bar');
Cookie
Request 和 Response 对象都包含一个公共 cookies 属性。该属性是 \Slim\Helper\Set 的一个实例。这个接口允许你轻松获取 Request 对象的 cookies,就像这样
$cookies = $app->request->cookies->all();
$cookie = $app->request->cookies->get('foo');
你还可以这样轻松地操作 Response 对象上的 cookies
$app->response->cookies->set('foo', 'bar');
当你在 Response 对象上设置一个 cookie 时,还可以传递一个数组作为 cookie 值来定义附加的 cookie 参数
$app->response->cookies->set('foo', array(
'value' => 'bar',
'domain' => 'example.com',
'path' => '/',
'expires' => time() + 3600,
'secure' => true,
'httponly' => true
));
由于 Slim 现在使用 \Slim\Helper\Set 接口来管理 Response 的 cookies,因此 cookie 值不会在 Slim 应用程序生命周期的末尾之前进行序列化和加密。这意味着即使在最初设置 cookies 之后,你也仍可以使用新的 \Slim\Helper\Set 接口继续操作 cookie 值。
请记住,这个新接口仅适用于 Response 对象实现。你仍然可以使用 \Slim\Slim::setCookie()
和 \Slim\Slim::getCookie()
方法,就像以前一样。
Slim Extras
当前的 Slim-Extras 仓库正在进行重大更改。我们将大幅简化第一方自定义视图,仅限于 Twig 和 Smarty。其他第三方视图将被弃用。
我们还将对 Slim-Extras 仓库进行重新组织,使其成为更具体的仓库。自定义视图将位于 Slim-Views 仓库中。Twig 和 Smarty 自定义视图都收到了重大的(可能会中断)更改。务必阅读它们各自的自述文件以了解更新。
我们还将在 Slim Framework 网站上建立一个新部分,以帮助你浏览和查找第三方 Slim Framework 附加组件(例如中间件、视图、记录器)。这一新增部分即将推出。敬请关注更新。
完整变更日志
- 增加路由组
- 增加资源定位器
- 增加 HTTP PATCH 方法支持
- 增加新的 \Slim\Helper\Set 接口
- 修复
\Slim\Slim::urlFor
方法中的 XSS 漏洞 - 简化默认错误处理程序
\Slim\Slim::handleErrors
- 在非调试模式下删除 \Slim\Middleware\PrettyExceptions
- 如果存在,让 HTTP 头保留 HTTP_ 前缀
- 将 \Slim\Helper\Set 接口添加到 \Slim\Http\Headers 和 \Slim\Http\Cookies
- 更新 \Slim\Slim,让 environment、request、response、router、log 和 view 成为公共属性。
- 更新 \Slim\Http\Request 和 \Slim\Http\Response,让 headers 和 cookies 成为实现 \Slim\Helper\Set 的公共属性。
- 添加 \Slim\Http\Response 方法
setStatus()
、getStatus()
、setBody()
、getBody()
和getLength()
- 更新 \Slim\Http\Response 对象,使其 cookies 和 headers 不会在应用程序生命周期的末尾之前进行序列化和加密。
- 使用 PSR-3 接口更新 \Slim\Log
- 弃用
\Slim\Log::warn()
,用\Slim\Log::warning()
替换 - 弃用
\Slim\Log::fatal()
,用\Slim\Log::critical()
替换 - 弃用方法 \Slim\Http\Request
cookies()
和headers()
- 弃用方法 \Slim\Http\Response
headers()
,header()
,length()
,body()
,status()
- 弃用 \Slim\Http\Response 接口 ArrayAccess、Countable 和 IteratorAggregate