Laravel 11 中的 API 版本控制

2024 年 7 月 17 日

随着发布 拉拉维尔 11 ,应用程序框架被精​​简,删除了每个项目都不需要的额外文件。这项更改的一部分是从应用程序源代码中删除了除 AppServiceProvider

更新后的应用程序框架的另一部分是删除默认安装中的 API 路由。假设您计划向应用程序添加 API,或者专门使用 Laravel 编写 API。在这种情况下,您可以设置 api 使用 Artisan 命令的中间件组和路由:

php artisan install:api

install:api 设置 api.php 路由文件(并对其进行配置)、个人访问令牌的数据库迁移以及 sanctum 配置文件。如果您不需要对 API 进行版本控制,那么这就是您需要做的全部工作。

在单独的文件中对 API 进行版本控制

在 Laravel 中编写版本化 API 的常见方法是将路由分成不同的文件。这样做可以简化推理特定 API 版本的开销,并保持整洁。在 Laravel 10 或更早版本中,一种常见的方法是将每个 API 版本的额外路由文件添加到 RouteServiceProvider :

$this->routes(function () {
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));

    Route::middleware('api')
        ->prefix('api/v1')
        ->group(base_path('routes/api_v1.php'));

    Route::middleware('api')
        ->prefix('api/v2')
        ->group(base_path('routes/api_v2.php'));

    Route::middleware('web')
        ->group(base_path('routes/web.php'));
});

在上面的例子中, routes/api.php 通常提供 /user Laravel sanctum 的端点,其余的 API 路由都隐藏在适当的版本中。

在 Laravel 11 中对 API 进行版本控制

随着路由引导移出 RouteServiceProvider 并进入 bootstrap/app.php, 这里有几种方法可以对你的 API 进行版本控制。

首先,让我们生成几个文件来演示如何设置路由:

touch routes/api_v1.php
touch routes/api_v2.php

php artisan make:controller --api Api/V1/PostsController
php artisan make:controller --api Api/V2/PostsController

使用适合您的任何文件名约定和位置。

接下来,打开 routes/api.php 文件并将以下行添加到文件底部:

Route::prefix('v1')->group(base_path('routes/api_v1.php'));
Route::prefix('v2')->group(base_path('routes/api_v2.php'));

上面的代码是 api.php 意味着我们已经在 api 路由前缀并使用 api 中间件组。

接下来,让我们为每个相应的 API 版本添加示例路由,以便我们可以直观地看到每个版本的路由列表。

这是 api_v1.php 文件:

<?php

use App\Http\Controllers\Api\V1\PostsController;

Route::apiResource('posts', PostsController::class);

还有 api_v2.php 文件:

<?php

use App\Http\Controllers\Api\V2\PostsController;

Route::apiResource('posts', PostsController::class);

定义好路由文件后,运行 route:list ,我们可以看到版本化的路线!

专家提示: 您可以使用以下方式隔离版本化路线 --path 标志,从而可以轻松关注特定的 API 版本:

php artisan route:list --path=api/v1
php artisan route:list --path=api/v2

如果你只输出以下路线,看看它看起来有多整洁 api/v2 :

在应用程序引导文件中定义版本化路由

我见过的另一种方法是在 bootstrap/app.php 文件使用 then: 参数,它接受一个 Closure :

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
        then: function () {
            Route::middleware('api')
                ->prefix('api/v1')
                ->group(base_path('routes/api/api_v1.php'));

            Route::middleware('api')
                ->prefix('api/v2')
                ->group(base_path('routes/api/api_v2.php'));
        }
    )
    // ...
;

我更喜欢直接添加额外的路线文件 routes/api.php ,但这是另一种可行的方法。在引导文件中定义路由时,这些组未配置为使用 api 中间件组。确保包含 api 中间件组与这些路线!


帖子 Laravel 11 中的 API 版本控制 首先出现在 Laravel 新闻

加入 Laravel 时事通讯 直接在您的收件箱中获取所有此类最新的 Laravel 文章。