15

我是 api 版本控制的新手,所以我的问题是:

1)这个文件夹结构是真的吗?

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

路线:

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

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

2)模型和事件的文件夹结构怎么样,我应该为每个版本制作模型吗?

4

1 回答 1

24

您的方法对于 API 版本控制是正确的。为避免Api\vN\在每个控制器路径之前重复前缀,您还可以执行以下操作:

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

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

另外不要忘记更改控制器的命名空间。例如:

namespace App\Http\Controllers\v1;

如果您不想自己管理它,也可以使用一些支持版本控制的 API 库。我成功使用了Dingo很多次,但可能还有更多可用的。

我不认为你应该版本模型。它们应该代表您当前的数据库结构,因此是唯一的。如果您需要进行一些更改,请尝试使其与您仍在维护的 API 版本向后兼容。

事件的情况相同,除非它们与您的 API 紧密耦合。在这种情况下,我认为最好的文件夹结构应该等同于控制器之一:

/app
  /Events
    /Api
      /v1
        /ApiEvent.php
      /v2
        /ApiEvent.php
    GenericEvent.php
于 2018-08-08T06:48:53.677 回答