中間件提供了一種方便的機制來檢查和過濾進入應用程式的 HTTP 請求。例如,Lithe 包含用於檢查應用程式使用者是否經過身份驗證的中間件。如果使用者未經過驗證,中間件會將使用者重新導向至應用程式的登入畫面。但是,如果使用者經過身份驗證,中間件將允許請求在應用程式內繼續進行。
在 Lithe 中,中間件是可以存取應用程式請求回應循環中的請求物件 ($req)、回應物件 ($res) 和 $next 函數的函數。 $next 函數是 Lithe 路由器中的一個函數,呼叫時會執行目前中間件旁的中間件。
中間件函數提供了一個方便的機制來檢查、過濾和處理進入應用程式的 HTTP 請求。
中介軟體可以執行下列任務:
如果目前中間件函數沒有結束請求-回應週期,則必須呼叫 $next() 將控制權傳遞給下一個中間件函數。否則,請求將被等待處理。
以下程式碼顯示了中間件函數呼叫的元素:
$app->use(function ($req, $res, $next) { $next(); });
地點:
- $req:中間件函數的 HTTP 請求參數,依慣例稱為「$req」。
- $res:中間件函數的 HTTP 回應參數,依慣例稱為「$res」。
- $next:中間件函數的回呼參數,依慣例稱為「$next」。
讓我們從一個名為 myLogger 的簡單中間件範例開始。每次請求通過該中間件時,該中間件都會列印 LOGGED 訊息。中間件被定義為指派給名為 myLogger 的變數的函數:
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
注意上面對 $next() 的呼叫。呼叫此函數會呼叫應用程式中的下一個中間件函數。 $next() 函數不是 PHP 或 Lithe 的一部分,但它是傳遞給中間件函數的第三個參數。 $next() 函數可以有任何名稱,但按照慣例,它總是稱為「next」。為了避免混淆,請始終使用此約定。
最好將中間件視為 HTTP 請求在到達應用程式之前必須遍歷的一系列「層」。每一層都可以檢查請求,甚至完全拒絕它。
要載入中間件函數,您可以呼叫 LitheApp 類別的 use() 方法,並指定所需的中間件函數。例如,以下程式碼在執行到根路徑(/)的路由之前載入 myLogger 中間件函數:
$app->use(function ($req, $res, $next) { $next(); });
每當應用程式收到請求時,它都會列印訊息「LOGGED」。
中間件載入順序很重要:先載入的中間件函數也會先執行。
myLogger 中間件函數只是列印一則訊息,然後透過呼叫 $next() 函數將請求傳遞給堆疊上的下一個中間件函數。
Lithe 應用程式可以使用以下類型的中間件:
使用 use() 和 METHOD() 方法將應用程式級中間件綁定到應用程式物件的實例,其中 METHOD 是中間件函數處理的請求的 HTTP 方法(例如 GET、PUT 或 POST)小寫。
此範例顯示了一個沒有組譯路徑的中間件函數。每次應用程式收到請求時都會執行該函數。
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
下面的範例顯示了一個處理路徑 /user/:id 中的 GET 請求的中間件。
$app = new \Lithe\App; $myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); }; $app->use($myLogger); $app->get('/', function ($req, $res, $next) { $res->send('Hello World!'); });
路由器級中間件的工作方式與應用程式級中間件相同,只是它綁定到 LitheHttpRouter 的實例。
$app->use(function ($req, $res, $next) { echo 'Hello World!'; $next(); });
使用 USE 和 METHOD 函數載入路由器級中間件。
以下範例程式碼展示了使用路由器級中間件的中間件系統:
$app->get('/user/:id', function ($req, $res, $next) { // Se o ID do usuário for '0', passa para o próximo middleware if ($req->param('id') === '0') { return $next(); } // Caso contrário, envia uma resposta específica $res->send('ID não é 0'); }, function ($req, $res) { // Envia uma resposta quando o ID for '0' $res->send('regular'); });
使用第三方中間件為 Lithe 應用新增功能。
安裝所需功能所需的 PHP 模組,然後在應用程式層級或路由器層級將其載入到您的應用程式中。
以下範例說明了載入會話中間件,即 LitheMiddlewareSessionsession 函式。
$router = new \Lithe\Http\Router;
Lithe 常用的第三方中間件功能的部分列表,請參閱:第三方中間件。
如果您需要可設定的中間件,請建立一個接受選項陣列或其他參數的函數,然後根據輸入參數傳回中間件實作。
$app->use(function ($req, $res, $next) { $next(); });
現在可以使用中間件了,如下圖所示。
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
以上是Lithe 中的中間件:它是如何運作的以及如何創建自己的中間件的詳細內容。更多資訊請關注PHP中文網其他相關文章!