”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Lithe 中间件:它是如何工作的以及如何创建自己的中间件

Lithe 中间件:它是如何工作的以及如何创建自己的中间件

发布于2024-11-08
浏览:115

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如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在 JavaScript 中可靠地将字符串转换为日期对象?
    如何在 JavaScript 中可靠地将字符串转换为日期对象?
    在 JavaScript 中将字符串转换为日期对象软件开发中的许多场景都涉及到日期和时间的处理。在 JavaScript 中,创建日期时,通常需要将表示日期的字符串转换为 Date 对象。下面是如何实现这种转换:推荐的字符串解析方法是利用 ISO 格式以及 Date 对象构造函数。例如:var st...
    编程 发布于2024-12-22
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于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
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于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,顾名思义,将给定 Run...
    编程 发布于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
  • 在 SQL 中更新同一个表后,如何安全地更新触发器内的表?
    在 SQL 中更新同一个表后,如何安全地更新触发器内的表?
    更新同一个表后更新触发器中的表在 SQL 中,更新触发器后更新表同一张表提出了一个潜在的问题。这是因为该表已针对更新操作锁定,并且尝试在作为同一事务的一部分执行的触发器内访问该表可能会导致冲突。要规避此限制,您可以更新通过使用 BEFORE 选项而不是 AFTER 来影响触发器中的列。这允许您在原始...
    编程 发布于2024-12-22
  • 使用PHP的DOMDocument提取节点时如何保留HTML标签?
    使用PHP的DOMDocument提取节点时如何保留HTML标签?
    使用 DOMDocument 提取 HTML 节点的问题简介DOMDocument 是一个 PHP 类,提供了一种便捷的解析方法以及操作 HTML 文档。然而,当尝试在提取内容时保留 HTML 标签时,用户可能会遇到困难。本文深入探讨了 DOM 的基本概念,并提出了应对这一挑战的解决方案。理解 DO...
    编程 发布于2024-12-22
  • 如何在 Python 类型提示中指定函数类型?
    如何在 Python 类型提示中指定函数类型?
    在类型提示中指定函数类型在Python中,类型提示用于提供有关变量和函数参数的预期类型的​​可选元数据。然而,将变量的类型提示指定为函数类型似乎不清楚。解决方案尽管相关中缺少“typing.Function” PEP 483,您可以使用以下命令将变量的类型提示指定为函数类型"typing....
    编程 发布于2024-12-22
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-12-22
  • 为什么我在发送 URL 编码的 POST 请求时收到 400 BAD REQUEST?
    为什么我在发送 URL 编码的 POST 请求时收到 400 BAD REQUEST?
    带有 URL 编码负载的 POST 请求当构造带有 URL 编码数据的 POST 请求时,经常会遇到 400 BAD REQUEST 响应,表明服务器无法理解负载。当有效负载提供不正确时,通常会出现此问题。标准库的 http.NewRequest(...) 方法期望将有效负载作为第三个参数提供,该参...
    编程 发布于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

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3