PHP项目怎么使用中间件?

wen java案例 2

本文目录导读:

PHP项目怎么使用中间件?

  1. 在 Laravel 中使用中间件(最常用)
  2. 在 ThinkPHP 6 中使用中间件
  3. 使用 Slim 框架(轻量级、非全栈)
  4. 纯原生 PHP 实现中间件队列

在 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

无论你使用哪种方式,中间件的核心思想都一致:将请求处理流程拆分成多个可插拔的步骤,每个步骤可以决定是否继续传递请求到下一个处理环节

如果你有具体框架或使用场景,可以告诉我,我可以给你更针对性的代码示例。

抱歉,评论功能暂时关闭!