Slim Framework 版本 2.3.0

Slim Framework 在版本 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 的許多內部物件(例如環境、要求、回應、檢視、記錄)都是使用上面示範的單例方法插入。您可以輕鬆覆寫 Slim 任何這些物件的預設實作。

$app = new \Slim\Slim();

// Override Slim's default Response object
$app->container->singleton('response', function () {
    return new \My\Response();
});

Slim 現在將使用您自訂的 \My\Response 類別作為其內部回應物件。Slim 目前沒有編寫其內部物件預期的介面;如果您打算覆寫 Slim 的任何內部物件,建議您使用子類別擴充內部物件。下一個版本將編寫 Slim 的介面預期,讓您在覆寫 Slim 的預設內部物件時更具彈性。

存取器

因為 Slim 使用資源定位器,現在可以將內部應用程式物件(例如要求和回應)直接存取為 Slim 應用程式執行個體的公用屬性。先前您仰賴存取器方法,例如 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 應用程式集合(例如要求和回應物件上的 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 介面。

標頭

要求和回應物件都包含公用標頭屬性。此屬性是 \Slim\Helper\Set 的執行個體。此介面可讓您輕鬆擷取要求物件的標頭,如下所示

$headers = $app->request->headers->all();
$header = $app->request->headers->get('Content-Type');

您也可以如同這樣,輕鬆處理回應物件的標頭

$app->response->headers->set('X-Foo', 'Bar');

Cookie

要求和回應物件都包含公用 cookie 屬性。此屬性是 \Slim\Helper\Set 的執行個體。此介面可讓您輕鬆擷取要求物件的 cookie,如下所示

$cookies = $app->request->cookies->all();
$cookie = $app->request->cookies->get('foo');

您可以像這樣輕鬆地以 Response 物件操控 cookie

$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 cookie,因此 cookie 值並不會在 Slim 應用程式生命週期的最後才序列化和加密。這表示即使最初已設定 cookie,您仍可以使用新的 \Slim\Helper\Set 介面繼續操控 cookie 值。

請注意,此新介面僅適用於 Response 物件實作。您仍然可以使用 \Slim\Slim::setCookie()\Slim\Slim::getCookie() 方法,就像以前一樣。

Slim Extras

目前的 Slim-Extras 儲存庫正在進行重大變更。我們會將第一方自訂程式簡化為僅限 Twig 和 Smarty。其他第三方程式將被捨棄。

我們還會將 Slim-Extras 儲存庫重新組織成更明確的儲存庫。自訂程式將會放在 Slim-Views 儲存庫中。Twig 和 Smarty 自訂程式都已收到重大(可能有問題)的變更。請務必閱讀其各自的 README 檔案,以取得最新資訊。

我們也會在 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,讓環境、要求、回應、路由器、日誌和程式成為公用屬性。
  • 更新 \Slim\Http\Request 和 \Slim\Http\Response,讓標頭和 cookie 為實作 \Slim\Helper\Set 的公用屬性。
  • 新增 \Slim\Http\Response 方法 setStatus()getStatus()setBody()getBody()getLength()
  • 更新 \Slim\Http\Response 物件,讓其 cookie 和標頭在應用程式生命週期的最後才序列化和加密。
  • 以 PSR-3 介面更新 \Slim\Log
  • \Slim\Log::warn() 停用,改以 \Slim\Log::warning() 取代
  • \Slim\Log::fatal() 停用,改以 \Slim\Log::critical() 取代
  • 將 \Slim\Http\Request 方法 cookies()headers() 停用
  • 已棄用的 \Slim\Http\Response 方法 標頭()標頭()長度()主體()狀態()
  • 已棄用的 \Slim\Http\Response 介面 ArrayAccess、Countable 和 IteratorAggregate