thinkphp8 中间件通过继承 think\middleware 基类并实现 handle() 方法来定义,全局中间件需在 app/middleware.php 文件中注册。具体做法是创建中间件类,在 handle() 中处理请求或调用 $next($request) 传递到下一个节点,然后在配置文件数组中添加该类名即可生效。

如何编写一个自定义中间件?
编写自定义中间件需要创建一个继承自 think\Middleware 的类,并在其中实现 handle() 方法。该方法接收 Request 对象和闭包 $next,你可以在调用 $next($request) 之前执行前置逻辑(如日志记录、权限检查),或在之后执行后置逻辑(如响应修改)。

<?php
namespace app\middleware;
use think\Middleware;
use think\facade\Request;
class TestMiddleware extends Middleware
{
public function handle(Request $request, \Closure $next)
{
// 前置逻辑:例如记录请求时间
$startTime = microtime(true);
// 执行后续中间件和控制器
$response = $next($request);
// 后置逻辑:例如添加响应头
$duration = microtime(true) - $startTime;
$response->header('X-Process-Time', number_format($duration, 4));
return $response;
}
}
上述代码定义了一个名为 TestMiddleware 的中间件,它计算请求处理耗时并将其添加到响应头中。要使用它,你需要将其注册为全局中间件或路由中间件。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
全局中间件如何注册与配置?
全局中间件需要在应用目录下的 app/middleware.php 文件中进行注册。该文件返回一个包含所有全局中间件类名的数组,ThinkPHP 会在每次请求时按顺序执行这些中间件。

<?php
// app/middleware.php
return [
\app\middleware\TestMiddleware::class,
\think\middleware\LoadLangPack::class,
\think\middleware\SessionInit::class,
];
在 app/middleware.php 中,你可以将自定义中间件类(如 \app\middleware\TestMiddleware)与其他系统内置中间件一起放入返回数组中。数组的顺序决定了中间件的执行顺序,先列出的先执行。确保类名正确且已导入命名空间,否则会导致加载失败。
如果中间件中抛出异常会怎样?
如果中间件中抛出未捕获的异常,请求流程会立即中断,不再执行后续的中间件和控制器,而是由 ThinkPHP 的全局异常处理器接管并生成错误响应。这允许你在中间件中集中处理错误场景,如非法访问或数据校验失败。


















