本文目录导读:

在 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) |
无论你使用哪种方式,中间件的核心思想都一致:将请求处理流程拆分成多个可插拔的步骤,每个步骤可以决定是否继续传递请求到下一个处理环节。
如果你有具体框架或使用场景,可以告诉我,我可以给你更针对性的代码示例。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播