本文目录导读:

在 PHP 项目中使用中间件,可以根据你使用的框架或纯原生环境,采用不同的方式,下面我会分别介绍框架内(如 Laravel、ThinkPHP、Slim)和纯原生 PHP 的实现思路。
在 Laravel 中使用中间件(最常用)
Laravel 的中间件系统非常成熟,常用于验证登录、日志记录、CORS 等。
1 创建中间件
php artisan make:middleware CheckAge
2 编写逻辑(app/Http/Middleware/CheckAge.php)
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
public function handle($request, Closure $next)
{
if ($request->age < 18) {
return redirect('home');
}
return $next($request);
}
}
3 注册中间件
在 app/Http/Kernel.php 中:
protected $routeMiddleware = [
// 其他中间件
'check.age' => \App\Http\Middleware\CheckAge::class,
];
4 在路由中使用
Route::get('/admin', function () {
// 只有年龄>=18才能访问
})->middleware('check.age');
在 ThinkPHP 6 中使用中间件
ThinkPHP 6 的中间件定义在 app/middleware.php 中。
1 创建中间件
php think make:middleware Auth
2 定义逻辑(app/middleware/Auth.php)
<?php
namespace app\middleware;
class Auth
{
public function handle($request, \Closure $next)
{
if (empty(session('user'))) {
return redirect('/login');
}
return $next($request);
}
}
3 注册中间件
在 app/middleware.php:
return [
\app\middleware\Auth::class,
// 全局中间件
];
4 在路由或控制器中使用
Route::group('admin', function () {
// 路由组
})->middleware(\app\middleware\Auth::class);
使用 Slim 框架(轻量级、非全栈)
Slim 4 的中间件是 PSR-15 兼容的,非常灵活。
1 创建中间件
class CorsMiddleware
{
public function __invoke($request, $handler)
{
$response = $handler->handle($request);
return $response
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type');
}
}
2 注册中间件
$app = Slim\Factory\AppFactory::create(); $app->add(new CorsMiddleware()); $app->run();
3 路由级中间件
$app->get('/admin', function ($request, $response) {
// ...
})->add(new AuthMiddleware());
纯原生 PHP 实现中间件队列
如果你没有使用框架,也可以自己实现一个简单的中间件管道(Pipeline)模式。
1 核心类
class Pipeline
{
private $middleware = [];
public function add($middleware)
{
$this->middleware[] = $middleware;
return $this;
}
public function run($request, $finalHandler)
{
$pipeline = array_reduce(
array_reverse($this->middleware),
function ($next, $middleware) {
return function ($request) use ($next, $middleware) {
return $middleware->handle($request, $next);
};
},
$finalHandler
);
return $pipeline($request);
}
}
2 使用示例
class LogMiddleware
{
public function handle($request, $next)
{
echo "[LOG] 请求开始\n";
$result = $next($request);
echo "[LOG] 请求结束\n";
return $result;
}
}
class AuthMiddleware
{
public function handle($request, $next)
{
if (!isset($request['user'])) {
return "需要登录";
}
return $next($request);
}
}
$pipeline = new Pipeline();
$pipeline->add(new LogMiddleware());
$pipeline->add(new AuthMiddleware());
$finalHandler = function ($request) {
return "Hello, " . $request['user'];
};
// 模拟请求
$request = ['user' => 'Alice'];
echo $pipeline->run($request, $finalHandler);
// 输出: [LOG] 请求开始
// Hello, Alice
// [LOG] 请求结束
| 场景 | 推荐方式 |
|---|---|
| Laravel 项目 | 用框架自带的 middleware() |
| ThinkPHP 6 | 定义在 app/middleware.php |
| Slim / 轻量框架 | 框架提供的 add() 方法(PSR-15) |
| 纯原生 PHP | 自己实现 Pipeline 模式 |
| 高性能 / 小项目 | 考虑使用 PSR-15 兼容库(如 middlewares/utils) |
无论你使用哪种方式,中间件的核心思想都一致:将请求处理流程拆分成多个可插拔的步骤,每个步骤可以决定是否继续传递请求到下一个处理环节。
如果你有具体框架或使用场景,可以告诉我,我可以给你更针对性的代码示例。