Laravel RESTful API 版本控制设计

Posted

技术标签:

【中文标题】Laravel RESTful API 版本控制设计【英文标题】:Laravel RESTful API versioning design 【发布时间】:2015-07-26 05:11:45 【问题描述】:

我是 Laravel(4 和 5)的新手,最近一直在研究 RESTful API。 为了允许 API 的多个版本,我使用 URL 来确定版本。

似乎大多数人都在遵循这种方法: How to organize different versioned REST API controllers in Laravel 4?

文件夹结构:

/app
  /controllers
    /Api
      /v1
        /UserController.php
      /v2
        /UserController.php

UserController.php 文件中,我相应地设置了命名空间:

namespace Api\v1;

namespace Api\v2;

在路线中:

Route::group(['prefix' => 'api/v1'], function () 
  Route::get('user',      'Api\v1\UserController@index');
  Route::get('user/id', 'Api\v1\UserController@show');
);

Route::group(['prefix' => 'api/v2'], function () 
  Route::get('user',      'Api\v2\UserController@index');
  Route::get('user/id', 'Api\v2\UserController@show');
);

版本 1 的 URL 将是 http://..../api/v1,版本 2 的 URL 将是 http://..../api/v2。这很简单。

我的问题是: 如果我正在构建 API 的小升级,比如 v1.1,我该如何组织我的文件夹结构? 我的想法如下,因为 dot 是文件夹的有效名称,这应该还可以吗?

/app
  /controllers
    /Api
      /v1
        /UserController.php
      /v1.1
        /UserController.php
      /v1.2
        /UserController.php
      /v2
        /UserController.php

还有,命名空间应该怎么写?没有这样的命名空间

namespace Api\v1.1;

我可以参考使用“点”的命名约定吗?

注意:我不想将其称为 v2 版本,因为这不是重大升级。

【问题讨论】:

如果你将使用 apiResource 路由,你应该使用“name”属性。 ->name('v2') 或 'name' => 'v2' 靠近前缀。 【参考方案1】:

IMO,次要升级不应发布对 API 的重大更改。所以我的建议是坚持使用整数版本的 API。增强没有问题,但现有端点应该像往常一样运行。

这样,您的 API 版本将与路由前缀和命名空间以及测试同步。

示例

    从 v1.0 开始 您进行了一点更改(例如 git-tag v1.1),但不会对您的 api 带来重大更改。开发人员是否需要在他们的代码中做其他事情?不,那里没有。因此,您可以放心地将 URI-Prefix 保留在 V1,以便调用您的 api 的开发人员无需更改调用您的 API 的所有代码(因此,自动受益于新的次要版本)。也许您只是修复了一个错误,使他们的代码按预期运行,或者您发布了一个新功能,该功能本身不会破坏现有的功能调用。 您的应用程序不断增长,并且您发布了重新设计的新 API 版本,其中包含重大更改。在这种情况下,您发布一个新的 API-URI-prefix (V2)。

请注意,您当然可以在内部跟踪次要版本(例如在 SCM 中),但开发人员无需更改所有 API 调用即可从您发布的小错误修复中受益。无论如何,如果您将较新的次要版本以及他们提供的错误修复或增强功能(博客、新闻通讯等)通知您的客户,那当然很好。

让我补充一下,我不知道任何带有次要 API-URL 前缀的 RESTful API,所以我想这是一种很常见的做法。

【讨论】:

您好,喷嘴人,您的观点与 aeryaguzov 不同。你的意思是它应该是 v2 而不是 v1.1 ,并且不对现有的 v1 代码进行任何更改? 感谢您的回复!我编辑了答案。我希望我的观点更清楚一点。 我也在考虑实现 API 版本。如果对 v1、v2 等使用此版本控制结构...在运行 composer 并执行自动加载转储时会出现任何问题吗? 我不明白你的意思。也许这符合如此独立的问题。 @JBMcClure jetamn 想说的是,对于 1.1 到 1.2 之类的版本,它们可能不会有重大变化,而这可以通过仅在该特定 API 中使用 if else 来完成。【参考方案2】:

您不能使用点,而是使用下划线。

但是……

一个设计好的api必须在小版本之间有BC,所以小更新不需要创建新版本,而是需要编写兼容的代码。

【讨论】:

明白你的意思。这意味着我应该向 v1 控制器扩展或添加新代码。【参考方案3】:

我创建了一个简单的 Laravel 包来支持 Laravel API 版本控制 它为路由添加了回退功能。 我个人很久以前就需要这个,但没有意识到用这么小的包就能实现。

https://github.com/mbpcoder/laravel-api-versioning

【讨论】:

以上是关于Laravel RESTful API 版本控制设计的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 开发 RESTful API 的一些心得

Java Web学习总结(43)—— Restful API 版本控制

Java Web学习总结(43)—— Restful API 版本控制

Restful API 如何进行版本控制 ? 这4种方法你要掌握!

HTTP Restful 语义版本控制

构建 RESTful API 和 Web 应用程序时的最佳实践 [关闭]