【问题标题】:Api versioning in laravel: routing depending on the "Accept" Headerlaravel 中的 Api 版本控制:路由取决于“接受”标头
【发布时间】:2015-05-08 02:58:03
【问题描述】:

因为我想在接受标头时触发端点,所以我创建了一个中间件来识别哪个版本正在使用客户端:

// ApiVersionMiddleware

public function handle($request, Closure $next)
{
    $route = $request->route();
    $actions = $route->getAction();

    $actions['uses'] = str_replace(
        '{api}',
        $request->header('api-version'),
        $actions['uses']
    );

    $route->setAction($actions);

    return $next($request);
}

然后我更改了默认的RouteServiceProvider 命名空间:

class RouteServiceProvider extends ServiceProvider {

//  protected $namespace = 'App\Http\Controllers'; // default value
    protected $namespace = null;
        .
        .     
}

最后,在我的routes.php 文件中,我有:

Route::group(['middleware' => 'api-version'], function()
{
    Route::resource('items', 'App\Http\Controllers\{api}\ItemsController', ['only' => ['show', 'index', 'store', 'destroy']]);
});

我尝试在 HttpKernel 类中注册中间件,而不是对路由定义进行分组,但没有成功。

我想知道是否有更好的方法来实现 API 版本控制。

  • 我希望每个版本都有一个routes.php 文件:v1-routes.phpv2-routes.php 等等。
  • 我不喜欢将我的路由定义分组在routes.php 中只是为了访问{api} 值的想法。还有其他方法可以找出我应该触发哪个控制器吗?

谢谢。

【问题讨论】:

  • 我一直在为同样的问题而苦苦挣扎,我也想让 v2 ​​路由被覆盖,所以如果没有为 /action 定义明确的 v2 路由,它会落入v1路线。请用任何发现/解决方案更新此帖子 - 我非常愿意跟随进展。

标签: php rest routing versioning laravel-5


【解决方案1】:

我想你可以在你的 routes.php 上尝试这样的事情,我没有测试过,但应该可以工作

switch (Request::header('api-version')) {
    case 'v2':
        include_once('routes_v2.php');
        break;

    default:
        include_once('routes_v1.php');
}

并且在 route_v....php 文件中定义路由,就像你通常做的那样。

更新

执行此操作的正确方法是在 RouteServiceProvider 的 map 函数中。您将只有两个路由文件。

您可以在 dingo/api 包中轻松管理多个版本的 api。这将为您节省大量时间。

【讨论】:

  • 是的,它不会,没有关闭的路线。 dingo/api 的 api 路由很好地解决了这个问题。
猜你喜欢
  • 2022-01-02
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多