在PHP Web开发中,中间件模式常用于在HTTP请求到达业务代码之前或响应返回客户端之前,统一处理鉴权、日志、跨域等通用逻辑。它通过把处理步骤拆成独立类,再按顺序调用,避免把判断代码写进控制器。下面直接看基础实现方式。

一、定义中间件接口
先声明一个统一的中间件接口,让所有中间件都实现同一个处理方法。该方法接收请求对象和下一个中间件调用器,返回响应。
<?php
interface Middleware
{
public function handle($request, callable $next);
}
二、编写具体中间件
1. 鉴权中间件
下面示例检查请求头里是否带有token,没有就直接返回401,否则交给下一个中间件。
<?php
class AuthMiddleware implements Middleware
{
public function handle($request, callable $next)
{
$token = $request->headers['token'] ?? '';
if ($token !== 'valid_token') {
return ['code' => 401, 'msg' => '未登录'];
}
return $next($request);
}
}
2. 日志中间件
日志中间件在请求前后各打一条记录,再继续执行后续逻辑。
<?php
class LogMiddleware implements Middleware
{
public function handle($request, callable $next)
{
echo "请求开始:" . $request->uri . "n";
$response = $next($request);
echo "请求结束n";
return $response;
}
}
三、组装并执行中间件
使用数组保存中间件,并通过reduce把类串成责任链,最后一个next执行业务处理。
<?php
class Request
{
public $uri;
public $headers = [];
}
$request = new Request();
$request->uri = '/user';
$request->headers['token'] = 'valid_token';
$middlewares = [new AuthMiddleware(), new LogMiddleware()];
$core = function ($request) {
return ['code' => 200, 'data' => '业务结果'];
};
$handler = array_reduce(
array_reverse($middlewares),
function ($next, $mw) {
return function ($request) use ($next, $mw) {
return $mw->handle($request, $next);
};
},
$core
);
$result = $handler($request);
print_r($result);
四、在框架中的使用建议
如果是自己写的轻量框架,可把上述Middleware接口作为基础,在路由分发前调用中间件栈。若使用Laravel等成熟框架,它们已内置管道(pipeline)机制,原理与上面reduce串联一致,只是写法更简洁。注意中间件里不要写复杂业务,只做请求或响应的横切处理,这样才能保持可复用性。
五、小结
PHP实现HTTP中间件模式并不复杂,核心是统一接口加顺序调用。通过把通用逻辑拆成中间件,控制器只关心业务,后续增加限流或跨域处理也只需新增一个类,维护成本明显降低。