ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-19 22:15:25  阅读:451  来源: 互联网

标签:php rest versioning routing 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.php,v2-routes.php等等.
>我不喜欢在routes.php中对路由定义进行分组的想法,只是为了访问{api}值.有没有其他方法可以找出我应该触发哪个控制器?

谢谢.

解决方法:

我想你可以在你的routes.php上尝试这样的东西我还没有测试但应该工作

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

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

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

UPDATE

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

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

标签:php,rest,versioning,routing,laravel-5
来源: https://codeday.me/bug/20190519/1138048.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有