laravel中的Api版本控制:路由取决于“接受”标头

时间:2015-03-06 13:33:59

标签: php rest routing versioning laravel-5

由于我想在接受标头上触发端点,我创建了一个中间件来识别使用客户端的版本:

// 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}值。有没有其他方法可以找出我应该触发哪个控制器?

感谢。

1 个答案:

答案 0 :(得分:5)

我猜你可以在你的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。它会为你节省很多时间。