php 实现中间件
中间件的基本概念
中间件是一种在请求处理前后执行特定逻辑的机制,常用于权限验证、日志记录、数据过滤等场景。PHP中可通过多种方式实现中间件,以下介绍两种常见方法。
基于闭包或类的中间件实现
定义一个中间件接口或抽象类,确保所有中间件遵循统一规范。
interface Middleware {
public function handle($request, Closure $next);
}
具体中间件实现接口,例如日志记录中间件:
class LogMiddleware implements Middleware {
public function handle($request, Closure $next) {
// 请求前逻辑
echo "Logging request: " . $request['path'] . "\n";
$response = $next($request); // 传递到下一个中间件
// 响应后逻辑
echo "Logging response\n";
return $response;
}
}
中间件调度与管道模式
通过管道(Pipeline)模式串联多个中间件,按顺序处理请求:
class Pipeline {
protected $middlewares = [];
public function through(array $middlewares) {
$this->middlewares = $middlewares;
return $this;
}
public function then(Closure $destination) {
$pipeline = array_reduce(
array_reverse($this->middlewares),
function ($next, $middleware) {
return function ($request) use ($next, $middleware) {
return (new $middleware)->handle($request, $next);
};
},
$destination
);
return $pipeline([]); // 传入初始请求
}
}
使用示例:
$pipeline = new Pipeline();
$response = $pipeline->through([
LogMiddleware::class,
AuthMiddleware::class
])->then(function ($request) {
return "Final response"; // 最终业务逻辑
});
框架中的中间件实践
现代PHP框架(如Laravel)已内置中间件支持。以Laravel为例:
创建中间件:
php artisan make:middleware CheckAge
编辑中间件逻辑:
public function handle($request, Closure $next) {
if ($request->age <= 18) {
return redirect('home');
}
return $next($request);
}
注册中间件到Kernel.php或路由:
// Kernel.php
protected $routeMiddleware = [
'age' => \App\Http\Middleware\CheckAge::class,
];
// 路由中使用
Route::get('profile', function () {
// ...
})->middleware('age');
注意事项
- 中间件顺序影响执行流程,需合理排列优先级。
- 避免在中间件中直接返回响应(除非明确需要中断流程)。
- 可通过依赖注入扩展中间件功能(如日志服务、数据库连接等)。







