在Laravel中管理多个API版本

时间:2020-09-13 23:53:33

标签: laravel api rest

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以在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