首页 > 解决方案 > 在 Laravel 中管理多个 API 版本

问题描述

我正在使用一个基本 URL(例如https://api.domain.com)公开 API 并让该 URL 处理 API 的所有版本(API 使用者需要发送Accept-Version请求标头以指示哪个版本他们尝试使用的 API)。

我将如何在 Laravel 中管理这种方法?

我在想我可以将我所有的控制器、助手、模型、路由、配置等放在一个1.0.0文件夹中,并将它们用于我的 API 版本 1。当我发布一个新版本时,我可能会复制原始代码,将它们放在一个1.1.0文件夹中,然后在那里进行更改。

如果我要使用这种文件夹方法,我需要在路由中做什么来指示要使用哪个文件夹?我的控制器如何知道要使用哪些模型、助手、配置等?感觉这种方法可能会变得非常混乱和令人费解。

标签: laravelapirest

解决方案


您可以在您RouteServiceProvider.php的应用程序中定义路由。在这里,您还可以为路由定义命名空间、名称前缀和中间件。只需为您的每个版本的 api 添加一个新的路线图。让中间件检查版本,必要时重定向,并将名称前缀/命名空间设置为正确的版本目录。

RouteServiceProvider看起来像:

protected function mapApi-1-0-0-Routes()
{
    Route::middleware(['api', 'version'])
        ->name('1.0.0.')
        ->namespace('1.0.0')
        ->group(base_path('routes/api.php'));
}

那么你middleware会看起来像

public function handle($request, Closure $next)
{
    switch ($request->version) {
        case "1.0.0":
            $route = $request->version.$request->route()->getName();
            break;
        // more versions

    return redirect()->route($route)->with($request);
}

我没有测试过这个。

路由组名称前缀: https ://laravel.com/docs/7.x/routing#route-group-name-prefixes

路由命名空间: https ://laravel.com/docs/7.x/routing#route-group-namespaces

重定向命名路由: https ://laravel.com/docs/7.x/redirects#redirecting-named-routes

全局中间件: https ://laravel.com/docs/7.x/middleware#global-middleware

写作服务提供者: https ://laravel.com/docs/7.x/providers#writing-service-providers


推荐阅读