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

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

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

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刪除
最新教學 更多>
  • 如何在MySQL中正確轉義撇號:反斜線或雙撇號?
    如何在MySQL中正確轉義撇號:反斜線或雙撇號?
    在MySQL 中轉義撇號:了解選項在MySQL 中,通常認為撇號(單引號)可以是使用反斜槓字元() 進行轉義。然而,使用雙撇號 ('') 來代替轉義序列似乎也有效,這引起了一些混亂。 根據 MySQL 文檔,這兩種方法都是有效且可以互換的。具體來說,文件指出,「用' 引用的字...
    程式設計 發佈於2024-12-22
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-22
  • PHP 設計模式:頁面控制器
    PHP 設計模式:頁面控制器
    頁面控制器設計模式是基於 Web 的系統中所使用的常見架構方法。它透過專用特定控制器來處理單一頁面或請求的邏輯來組織控制流程。這種方法有助於隔離職責,使程式碼庫更易於維護和發展。 什麼是頁面控制器? 在頁面控制器模式中,每個頁面(或一組具有相似行為的頁面)都有自己的控制器,負責: ...
    程式設計 發佈於2024-12-22
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-22
  • 日日理解 Python 中的字串 |  天蟒
    日日理解 Python 中的字串 | 天蟒
    第 8 天:Python 中的使用者輸入 | 100 天 Python 在 Python 中,字串作為一種資料類型發揮著至關重要的作用,它允許您處理文字資料。在本部落格中,我們將探討字串的基礎知識、創建字串的不同方法以及多行字串、索引和循環字串中的字元等高級概念。本指南將使您對字串有深入的了解,幫助...
    程式設計 發佈於2024-12-22
  • 如何防止無效數獨輸入重新出現在 JFormattedTextFields 中?
    如何防止無效數獨輸入重新出現在 JFormattedTextFields 中?
    透過驗證處理數獨文本框開發數獨遊戲GUI 時,確保文字方塊中的使用者輸入經過驗證至關重要到遊戲規則。在所描述的場景中,JFormattedTextField 用於文字框,但出現了一個問題,即在輸入無效值並向前跳格後,先前的有效值重新出現。 了解問題此問題源自於 JFormattedTextField...
    程式設計 發佈於2024-12-22
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-22
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-22
  • 如何在 JavaScript 中可靠地將字串轉換為日期物件?
    如何在 JavaScript 中可靠地將字串轉換為日期物件?
    在 JavaScript 中將字串轉換為日期物件軟體開發中的許多場景都涉及日期和時間的處理。在 JavaScript 中,建立日期時,通常需要將表示日期的字串轉換為 Date 物件。以下是如何實現這種轉換:推薦的字串解析方法是利用 ISO 格式以及 Date 物件建構子。例如:var st = &q...
    程式設計 發佈於2024-12-22
  • 如何擺脫Python中的循環依賴?
    如何擺脫Python中的循環依賴?
    如何在 Python 中避免循環依賴循環依賴可能是軟體開發中的常見問題,尤其是在使用分層架構或複雜模組結構時。在 Python 中,循環依賴可能會導致多種問題,包括匯入錯誤和屬性錯誤。 可能導致循環依賴的場景一個可能導致循環依賴的常見場景是兩個類別時依賴彼此的實例作為屬性。例如:class A: ...
    程式設計 發佈於2024-12-22
  • 在 JavaScript 中使用 setTimeout 時如何保留「this」引用?
    在 JavaScript 中使用 setTimeout 時如何保留「this」引用?
    setTimeout 和JavaScript 中難以捉摸的「this」使用setTimeout 函數時,開發者經常會遇到後續呼叫方法遺失的問題他們的預期上下文,導致看似未定義的方法。這通常是由於丟失“this”引用引起的。 問題:考慮以下程式碼:test.prototype.method = fun...
    程式設計 發佈於2024-12-22
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-22
  • 為什麼要使用 SwingUtilities.invokeLater?
    為什麼要使用 SwingUtilities.invokeLater?
    SwingUtilities.invokeLater:仔細觀察在 Swing 程式設計領域,SwingUtilities.invokeLater 扮演至關重要的角色。這個方法到底是做什麼的,它跟在主執行緒直接執行程式碼有何不同? SwingUtilities.invokeLater,顧名思義,將給定...
    程式設計 發佈於2024-12-22
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-22
  • 如何在 Spring 中串流大型 MySQL 結果集以避免 OutOfMemoryError?
    如何在 Spring 中串流大型 MySQL 結果集以避免 OutOfMemoryError?
    使用MySQL 串流處理大型結果集在Spring 應用程式中處理大量MySQL 表時,當驅動程式試圖執行下列操作時,可能會出現OutOfMemoryException:將整個表載入到記憶體中。設定statement.setFetchSize(Integer.MIN_VALUE);可能還不夠,因為這僅...
    程式設計 發佈於2024-12-22

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

Copyright© 2022 湘ICP备2022001581号-3