」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Lithe 中間件:它是如何運作的以及如何創建自己的中間件

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

發佈於2024-11-08
瀏覽:240

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 请求在到达应用程序之前经过的一系列“层”。每层都可以检查或拒绝请求。


加载中间件

要加载中间件,请调用 \Lithe\App 类的 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() 将请求传递给下一个中间件。


使用中间件

灵活的应用程序可以使用以下类型的中间件:

  • 应用级中间件
  • 路由器级中间件
  • 第三方中间件

应用层中间件

您可以使用 use() 或 METHOD() 方法将应用程序级中间件附加到应用程序的实例,其中 METHOD 指小写的 HTTP 方法(例如 GET、PUT、POST)。

此示例显示没有路径的中间件。每次收到请求时中间件都会运行:

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

在下面的示例中,中间件处理对路径 /user/:id:
的 GET 请求

$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\Http\Router 的实例:

$router = new \Lithe\Http\Router;

您可以使用 use() 和 METHOD() 函数加载路由器级中间件。

下面是路由器级中间件的示例:

$router = new \Lithe\Http\Router;

$router->use(function ($req, $res, $next) {
    echo 'Time: ', Date('H:i:s'), '
'; $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);

第三方中间件

您可以使用第三方中间件向您的 Lithe 应用程序添加功能。安装所需的 PHP 模块,然后在应用程序或路由器级别加载它。

下面是使用 \Lithe\Middleware\Session\session 加载会话中间件的示例:

use function Lithe\Middleware\Session\session;

$app = new \Lithe\App;

$app->use(session([
    'secure' => true
]));

有关 Lithe 常用的第三方中间件列表,请查看第三方中间件资源。


可配置中间件

如果您需要可配置中间件,您可以创建一个接受选项数组或其他参数的函数,然后根据这些参数返回中间件实现。请参阅下面的示例:





现在,您可以使用具有自定义配置的中间件:

$app->use(my_middleware(['option1' => '1', 'option2' => '2']));

要创建其他开发人员可以通过 Composer 安装的中间件,有一个名为 lithemod/flow 的包。它提供了用于在 Lithe 中处理 HTTP 请求和响应的接口和实用程序,这有助于跨各种应用程序创建标准化且随时可用的中间件。

lithemod/flow 通过为请求和响应提供统一的接口来帮助构建强大的中间件,使开发更加高效和有组织。这简化了中间件与其他项目的集成,并确保代码遵循一致的标准。

版本聲明 本文轉載於:https://dev.to/lithephp/middleware-in-lithe-how-it-works-and-how-to-create-your-own-3h67?1如有侵犯,請洽study_golang@163 .com刪除
最新教學 更多>
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-03-10
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-03-10
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-03-10
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-03-10
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-03-10
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-03-10
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-03-10
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-03-10
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-03-10
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-03-10
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-03-10
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。讓我們考慮以下查詢: select data d.data_ti...
    程式設計 發佈於2025-03-10
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-03-10
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-03-10

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3