Laravel网关路由怎么配置

wen PHP项目 1

本文目录导读:

Laravel网关路由怎么配置

  1. 基础路由分组(API 网关雏形)
  2. 中间件网关(权限/认证校验)
  3. 动态路由转发(微服务网关)
  4. 使用 Laravel 网关包
  5. 自定义路由加载器
  6. 推荐的最佳实践

在 Laravel 中,网关路由通常是指API 网关模式路由分组的高级配置,主要用于统一管理微服务入口、实现请求转发、权限校验或版本控制。

根据你的具体需求,常见的有以下几种配置方式:

基础路由分组(API 网关雏形)

最基础的“网关”就是将多个路由统一放在一个前缀下:

// routes/api.php
Route::prefix('v1')->group(function () {
    Route::get('/users', [UserController::class, 'index']);
    Route::post('/users', [UserController::class, 'store']);
    Route::get('/products', [ProductController::class, 'index']);
});
Route::prefix('v2')->group(function () {
    Route::get('/users', [UserControllerV2::class, 'index']);
});

访问:/api/v1/users/api/v2/users

中间件网关(权限/认证校验)

使用中间件作为网关层,统一校验后才放行到具体路由:

Route::prefix('api')->group(function () {
    // 公开接口(无需认证)
    Route::post('/login', [AuthController::class, 'login']);
    Route::post('/register', [AuthController::class, 'register']);
    // 需要认证的接口(通过中间件网关)
    Route::middleware(['auth:sanctum', 'throttle:60,1'])->group(function () {
        Route::get('/user/profile', [UserController::class, 'profile']);
        Route::post('/orders', [OrderController::class, 'store']);
        // 管理员专用
        Route::middleware('role:admin')->group(function () {
            Route::get('/admin/users', [AdminController::class, 'listUsers']);
        });
    });
});

动态路由转发(微服务网关)

如果需要将请求转发到其他微服务,可以自定义一个网关路由:

// routes/api.php
Route::any('/gateway/{service}/{path}', function ($service, $path) {
    // 定义服务映射
    $services = [
        'users'  => 'http://user-service/api/',
        'orders' => 'http://order-service/api/',
        'payments' => 'http://payment-service/api/',
    ];
    if (!isset($services[$service])) {
        return response()->json(['error' => 'Service not found'], 404);
    }
    $targetUrl = $services[$service] . $path;
    // 转发请求(使用 GuzzleHttp 或 Laravel HTTP Client)
    $response = Http::withHeaders(request()->headers->all())
                     ->send(request()->method(), $targetUrl, [
                         'query' => request()->query(),
                         'body'  => request()->all()
                     ]);
    return $response->json();
});

使用 Laravel 网关包

对于生产环境,建议使用成熟的网关包:

A. Laravel API Gateway (by renoki-co)

composer require renoki-co/laravel-api-gateway

配置 config/gateway.php

'gateways' => [
    'api' => [
        'routes' => [
            '/users' => [
                'target' => 'http://user-service/api/users',
                'method' => ['GET', 'POST'],
            ],
        ],
        'middleware' => ['auth:api'],
        'prefix' => '/api/v1',
    ],
],

B. Laravel Kong Gateway 集成

如果使用 Kong 作为网关,只需配置 Laravel 正常输出 API,Kong 负责转发:

# Kong 配置示例
curl -i -X POST http://localhost:8001/services \
  --data "name=laravel-api" \
  --data "url=http://laravel-app/api"
curl -i -X POST http://localhost:8001/services/laravel-api/routes \
  --data "paths[]=/api"

自定义路由加载器

对于大型项目,可以按模块自动加载路由:

// App\Providers\RouteServiceProvider.php
public function boot()
{
    parent::boot();
    // 自动加载 Modules 目录下的路由
    foreach (glob(app_path('Modules/*/routes/api.php')) as $routeFile) {
        Route::prefix('api/v1')
             ->middleware('api')
             ->group($routeFile);
    }
}

推荐的最佳实践

对于生产环境,建议:

  1. 小项目:使用 Laravel 自带的路由分组 + 中间件
  2. 中大型项目:使用 KongNginxAWS API Gateway 作为外部网关
  3. 微服务架构:使用 Laravel API Gateway 包 或自定义 Http 转发

核心要点

  • 路由分组定义入口
  • 中间件实现认证/限流
  • 转发到具体服务(或直接使用 Laravel 控制器)
  • 统一错误处理

需要根据你的实际架构选择最适合的方式。

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