本文目录导读:

在 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);
}
}
推荐的最佳实践
对于生产环境,建议:
- 小项目:使用 Laravel 自带的路由分组 + 中间件
- 中大型项目:使用 Kong、Nginx 或 AWS API Gateway 作为外部网关
- 微服务架构:使用 Laravel API Gateway 包 或自定义 Http 转发
核心要点:
- 路由分组定义入口
- 中间件实现认证/限流
- 转发到具体服务(或直接使用 Laravel 控制器)
- 统一错误处理
需要根据你的实际架构选择最适合的方式。