Php laravel中的Api版本控制:路由取决于;接受;标题

Php laravel中的Api版本控制:路由取决于;接受;标题,php,rest,routing,versioning,laravel-5,Php,Rest,Routing,Versioning,Laravel 5,由于我希望在accept标头时触发端点,因此我创建了一个中间件来标识使用客户端的版本: // ApiVersionMiddleware public function handle($request, Closure $next) { $route = $request->route(); $actions = $route->getAction(); $actions['uses'] = str_replace( '{api}',

由于我希望在accept标头时触发端点,因此我创建了一个中间件来标识使用客户端的版本:

// 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.php
    v2 routes.php
    等等
  • 我不喜欢将路由定义分组到
    routes.php
    中只是为了访问
    {api}
    值。有没有其他方法可以确定我应该解雇哪个控制器

谢谢。

我想你可以在你的路线上尝试类似的东西。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。这将为您节省大量时间。

我一直在努力解决同一问题,我还希望使v2路由成为覆盖,因此,如果没有为/操作定义明确的v2路由,它将落入v1路由。请用任何发现/解决方案更新这篇文章-我非常希望跟踪进度。是的,不会,也不会关闭路线。dingo/api通过其api路由很好地解决了这个问题。