随着 Laravel 11 的发布,应用程序的框架被精简了,删除了每个项目都不需要的额外文件。该更改的一部分从应用程序源代码中删除了除 AppServiceProvider
之外的所有服务提供程序。
更新后的应用程序框架的另一部分是删除默认安装中的 API 路由。假设您计划在应用程序中添加 API 或仅使用 Laravel 编写 API。在这种情况下,您可以使用 Artisan 命令设置 api
中间件组和路由:
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
通常为 Laravel sanctum 提供一个 /user
端点,其余的 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:
参数定义其他 API 路由,该参数接受 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
中间件组!