版本 2.3.0 的 Slim 框架

Slim 框架在版本 2.3.0 中包含很多新颖有用的功能。它向下兼容上一个版本。在我更新官方文档时,这里有一些提示帮助你开始使用 Slim 的新功能。

下载版本 2.3.0

路由组

现在可以对路由进行分组。这帮助你避免在每个路由定义中复制路由的 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