php 实现中间件
中间件的基本概念
中间件是一种在请求和响应之间进行处理的机制,允许在请求到达目标处理程序之前或之后执行特定逻辑。常用于身份验证、日志记录、数据过滤等场景。
实现中间件的步骤
定义中间件接口 创建一个中间件接口,规定所有中间件必须实现的方法。例如:
interface Middleware {
public function handle($request, Closure $next);
}
创建具体中间件类 实现具体的中间件逻辑。例如一个简单的日志中间件:
class LogMiddleware implements Middleware {
public function handle($request, Closure $next) {
// 前置逻辑
echo "Logging request: " . $request . "\n";
$response = $next($request);
// 后置逻辑
echo "Logging response\n";
return $response;
}
}
创建中间件管道 构建一个管道来管理中间件的执行顺序:
class Pipeline {
protected $middlewares = [];
public function add(Middleware $middleware) {
$this->middlewares[] = $middleware;
}
public function run($request) {
$middleware = array_shift($this->middlewares);
if ($middleware === null) {
return $request;
}
return $middleware->handle($request, function($request) {
return $this->run($request);
});
}
}
使用中间件 在实际应用中组合和使用中间件:
$pipeline = new Pipeline();
$pipeline->add(new LogMiddleware());
$pipeline->add(new AuthMiddleware());
$response = $pipeline->run($request);
中间件的扩展应用
支持匿名函数 允许直接使用闭包作为中间件:
$pipeline->add(function($request, $next) {
echo "Anonymous middleware\n";
return $next($request);
});
支持参数传递 通过构造函数或方法参数向中间件传递配置:
class ParamMiddleware implements Middleware {
private $param;
public function __construct($param) {
$this->param = $param;
}
public function handle($request, $next) {
echo "Parameter: " . $this->param . "\n";
return $next($request);
}
}
异常处理 在管道中添加异常处理逻辑:
try {
$response = $pipeline->run($request);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
实际框架中的实现参考
现代PHP框架如Laravel和Symfony都提供了成熟的中间件实现。Laravel的中间件系统特别值得参考:
- 通过HTTP内核注册全局中间件
- 为路由指定特定中间件
- 提供中间件优先级控制
- 支持前置和后置处理逻辑
这些实现展示了生产环境中中间件系统的完整形态,包括依赖注入、响应对象封装等高级特性。







