首頁  >  文章  >  後端開發  >  Lithe 中的中間件:它是如何運作的以及如何創建自己的中間件

Lithe 中的中間件:它是如何運作的以及如何創建自己的中間件

DDD
DDD原創
2024-10-25 03:28:29419瀏覽

Middleware in Lithe: How It Works and How to Create Your Own

中間件提供了一種方便的機制來檢查和過濾進入應用程式的 HTTP 請求。 例如,Lithe 包含用於檢查使用者是否經過驗證的中間件。如果沒有,中間件會將使用者重新導向到登入畫面。如果使用者通過身份驗證,中間件將允許請求繼續進行。

中間件如何在 Lithe 中工作

在 Lithe 中,中間件是可以存取請求物件 ($req)、回應物件 ($res) 和應用程式請求-回應週期中的 $next 函數的函數。 $next 函數在呼叫時會呼叫目前堆疊中的下一個中間件。

中間件函數提供了一個方便的方法來檢查、過濾和操作應用程式傳入的 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() 方法,並指定中間件函數。例如:

$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!');
});

每當應用程式收到請求時,都會列印訊息「LOGGED」。中間件載入的順序很重要:先載入的先執行。

myLogger 中間件只是列印一則訊息,然後使用 $next() 將請求傳遞給下一個中間件。


使用中介軟體

Lithe 應用程式可以使用以下類型的中間件:

  • 應用級中間件
  • 路由器級中間件
  • 第三方中介軟體

應用層中介軟體

您可以使用 use() 或 METHOD() 方法將應用程式級中間件附加到應用程式的實例,其中 METHOD 指小寫的 HTTP 方法(例如 GET、PUT、POST)。

此範例顯示沒有路徑的中間件。每次收到請求時中間件都會運作:

$app->use(function ($req, $res, $next) {
    $next();
});

在下面的範例中,中間件處理對路徑 /user/:id:
的 GET 請求

$myLogger = function ($req, $res, $next) {
  echo 'LOGGED';
  $next();
};

路由器級中介軟體

路由器級中間件的工作方式類似於應用程式級中間件,但附加到 LitheHttpRouter 的實例:

$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!');
});

您可以使用 use() 和 METHOD() 函數來載入路由器級中間件。

這是路由器級中間件的範例:

$app->use(function ($req, $res, $next) {
    echo 'Hello World!';
    $next();
});

第三方中介軟體

您可以使用第三方中間件為您的 Lithe 應用程式添加功能。安裝所需的 PHP 模組,然後在應用程式或路由器層級載入它。

這是使用 LitheMiddlewareSessionsession 載入會話中間件的範例:

$app->get('/user/:id', function ($req, $res, $next) {
    if ($req->param('id') === '0') {
        return $next();
    } 
    $res->send('ID is not 0');
}, function ($req, $res) {
    $res->send('regular');
});

有關 Lithe 常用的第三方中間件列表,請查看第三方中間件資源。


可配置中介軟體

如果您需要可配置中間件,您可以建立一個函數,該函數接受一組選項或其他參數,然後根據這些參數傳回中間件實作。請參閱下面的範例:

$router = new \Lithe\Http\Router;

現在,您可以使用具有自訂配置的中間件:

$router = new \Lithe\Http\Router;

$router->use(function ($req, $res, $next) {
    echo 'Time: ', Date('H:i:s'), '<br>';
    $next();
});

$router->get('/user/:id', function ($req, $res, $next) {
    if ($req->param('id') === '0') {
        $res->redirect('/');
    }
    $next();
}, function ($req, $res) {
    echo $req->param('id');
    $res->render('special');
});

$app->use('/api', $router);

要建立其他開發人員可以透過 Composer 安裝的中間件,有一個名為 lithemod/flow 的套件。它提供了用於在 Lithe 中處理 HTTP 請求和回應的介面和實用程序,這有助於跨各種應用程式建立標準化且隨時可用的中間件。

lithemod/flow 透過為請求和回應提供統一的介面來幫助建立強大的中間件,使開發更加高效和有組織。這簡化了中間件與其他項目的集成,並確保程式碼遵循一致的標準。

以上是Lithe 中的中間件:它是如何運作的以及如何創建自己的中間件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn