php 实现中间件
PHP 实现中间件的方法
使用闭包实现中间件
闭包(匿名函数)是PHP中实现中间件的简单方式。通过将请求和响应对象传递给闭包,可以在处理请求前后执行特定逻辑。
$middleware = function ($request, $next) {
// 前置处理逻辑
echo "Before handling request\n";
$response = $next($request);
// 后置处理逻辑
echo "After handling request\n";
return $response;
};
使用类实现中间件
通过定义一个中间件类,可以实现更结构化的中间件逻辑。通常需要实现一个handle方法。
class AuthMiddleware {
public function handle($request, $next) {
if (!isset($_SESSION['user'])) {
header('Location: /login');
exit;
}
return $next($request);
}
}
中间件栈的实现
通过将多个中间件按顺序组合,可以形成一个中间件栈。每个中间件调用下一个中间件,直到最终处理请求。
$middlewareStack = [
new AuthMiddleware(),
new LoggingMiddleware(),
new RequestHandler()
];
$handler = array_reduce(
array_reverse($middlewareStack),
function ($next, $middleware) {
return function ($request) use ($next, $middleware) {
return $middleware->handle($request, $next);
};
},
function ($request) {
return new Response('Hello World');
}
);
$response = $handler(new Request());
PSR-15 中间件标准
遵循PSR-15标准可以实现更通用的中间件接口。定义一个中间件类需要实现Psr\Http\Server\MiddlewareInterface。
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class ExampleMiddleware implements MiddlewareInterface {
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface {
// 前置处理
$response = $handler->handle($request);
// 后置处理
return $response;
}
}
框架中的中间件实现
许多PHP框架(如Laravel、Symfony)内置了中间件支持。以Laravel为例,可以通过artisan命令生成中间件。
php artisan make:middleware CheckAge
生成的中间件类需要实现handle方法:
namespace App\Http\Middleware;
use Closure;
class CheckAge {
public function handle($request, Closure $next) {
if ($request->age <= 18) {
return redirect('home');
}
return $next($request);
}
}
中间件的注册与使用
在框架中注册中间件通常通过配置文件或路由定义完成。Laravel中可以在Kernel.php中注册全局中间件或路由中间件。

protected $middleware = [
\App\Http\Middleware\CheckAge::class,
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
];






