Slim 架構應用程式生命週期
一個網頁應用程式的核心非常簡單:接收 HTTP 要求,啟動適當的程式碼,傳回 HTTP 回應。Slim 架構可以輕易建置並啟動小型網頁應用程式和 API,並藉由使用簡單且容易使用的介面隱藏應用程式的必要基礎建設。如果您對於低階的細節有興趣,以下說明從開始到結束,Slim 應用程式的生命週期有哪些步驟。
執行個體產生
執行個體產生時,Slim 會建立一個 Request 物件,提供一個簡易介面以處理目前的 HTTP 要求。Slim 也會建立一個 Response 物件,預設情況下會傳回一個 200 OK 回應,採用 HTML 格式;Response 物件會決定回應給用戶端的 HTTP 回應狀態碼、內容類型和本體。
建立 Request 和 Response 物件後,Slim 會建立一個 Router 物件和一個 View 物件。Router 物件會組織 Slim 應用程式的路由,View 物件會呈現樣板內容,做為 HTTP 回應本體。最後,如果尚未啟動 PHP 工作階段,Slim 會啟動一個 PHP 工作階段。
Router 和 View 物件會在幕後執行。Request 和 Response 物件通常會直接與控制器程式碼有關,且可以透過 $app->request()
和 $app->response()
,分別從應用程式的任何位置存取這兩個物件。
路由定義
執行個體產生之後,會定義 Slim 應用程式的路由。路由是一個集合,包含 URI、控制器程式碼,以及路由要回應的一種或多種 HTTP 方法。
$app = new Slim(); $app->get('/foo', function () {
//Controller code
});
$app->run();
這個範例示範一個路由,將 URI “/foo” 對應到一個 HTTP GET 要求的特定控制器程式碼。$app->get()
、$app->post()
、$app->put()
、$app->delete()
、$app->options()
或 $app->map()
Slim 應用程式實例方法可以定義應用程式路由,以回應相對應的 HTTP 要求方法。
當呼叫這些 Slim 應用程式實例方法之一以定義路由時,Router 物件會將指定的 URI 與針對給定 HTTP 要求方法的特定控制器程式碼建立關聯,並形成一個路由物件。
Router 傳回的結果路由物件提供可串連的方法,例如 $route->name()
、$route->conditions()
和 $route->via()
,這些方法讓您可以在執行 Slim 應用程式前進一步自訂路由物件。
執行應用程式
定義應用程式路由後,我們會呼叫 $app->run()
方法來啟動 Slim 應用程式。Slim 會建立一個新輸出緩衝區來擷取 run()
方法期間 echo()
的內容(也就是來自路由的控制器程式碼或中間軟體)。Slim 會藉由 $app->applyHook()
在執行方法中的不同掛鉤上呼叫中間軟體;這讓開發人員能夠在執行循環中的指定點呼叫排隊的回呼函式。
接著,Slim 會迴圈執行符合目前 HTTP 要求 URI 的所有路由物件。路由器物件會直接用於 foreach 迴圈;這是因為路由器實作了 IteratorAggregate 介面,並在從 foreach 迴圈等反覆運算的內容呼叫時回傳 ArrayIterator 物件。
路由器會詢問各個路由物件是否符合目前的 HTTP 要求 URI。路由物件在被詢問時會將自己的樣式 (例如 /hello/:first/:last) 編譯成正規表示法,考量選用參數或參數條件。如果 HTTP 要求 URI 符合產生的路由正規表示法,路由器會將路由物件附加到執行循環反覆運算中會回傳的符合路由陣列。
每個路由物件都知道自己會回應哪些 HTTP 方法。對於每個反覆運算迴圈,如果目前的路由物件會回應目前的 HTTP 要求方法,Slim 會呼叫路由的控制器程式碼。不過,如果目前的路由物件不會回應目前的 HTTP 要求方法,目前的路由物件會回應的方法會附加到 $httpMethodsAllowed 陣列 (之後如果 Slim 回傳 405 方法不允許的 HTTP 回應,會使用到這個陣列)。
如果一個路由物件會回應目前的 HTTP 要求方法,而且在路由的控制器呼叫期間並未發生例外狀況,Slim 會跳出路由反覆運算迴圈,並將目前的輸出緩衝區內容附加到回應物件的本體屬性。
如果路由符合 HTTP 要求 URI,但與 HTTP 要求方法不符,Slim 會根據符合路由會回應的 HTTP 方法清單回傳 405 方法不允許的 HTTP 回應,並附帶 Allow 標頭。
如果沒有路由符合 HTTP 要求 URI,Slim 會呼叫應用程式的找不到處理常式,並回傳 404 找不到回應。找不到處理常式的動作會與路由相同;其傳送到輸出緩衝區的內容會附加到回應物件的本體。
路由反覆運算完成,且已準備好回應物件後,Slim 會保留快閃訊息,並在將回應物件傳送到 HTTP 客戶端前將 $_SESSION
資料刷新到工作階段資料儲存庫。