版本 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 superglobal 中的環境資料,提供了一個 mock() 公共實例方法,讓您可以自己定義環境變數。這樣一來,您可以建立模擬 HTTP 要求來測試 Slim 應用程式。
HTTP Cookie
較早版本的 Slim Framework 信賴 PHP 原生 setcookie()
函式,才能在 HTTP 回應中傳送 HTTP Cookie。1.5.2 版本使用自己的實作來建構 Set-Cookie
標頭,提供中間軟體機會在遞送至用戶端前檢查和處理原始標頭。
由於 1.5.2 版本使用自己的底層 Cookie 實作,因此現在採用 PHP < 5.2 的使用者可使用 Set-Cookie
標頭的「HttpOnly」參數;這在 PHP 的原生 setcookie()
方法中無法做到。
會話
在較早版本的 Slim Framework 中,會話採行大一統的方式。然而,1.5.2 版本並未自動啟動 PHP 會話。如果要使用 PHP 會話,您必須自行設定和啟動 PHP 會話。
舊版本也提供儲存在雜湊、加密 HTTP Cookie 中的安全會話。這項功能已從核心架構中抽取出來變成選用的中間軟體。若要使用持續在 HTTP Cookie 中的安全會話,請將 Slim_Middleware_SessionCookie 中間軟體新增至您的應用程式。在使用安全會話 Cookie 中間軟體時,您將繼續使用 $_SESSION
superglobal,但無需啟動原生 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%。這將持續改進。