Laravel 5.3 API 版本控制

Laravel 5.3 API Versioning

我正在尝试为我正在处理的 API 设置 api 版本控制,我发现这个 post 解释了如何使用中间件和替换字符串在路线本身。基本上像这样指定路线。

Route::group(['middleware' => ['api-version']], function() {
  Route::get('/endoint', ['uses' => '{api-namespace}\EndpointController@endpoint']);
});

但是,当我尝试这样做时,出现以下错误

Class App\Http\Controllers\{api-namespace}\EndpointController does not exist

看起来容器在 运行 执行替换的中间件之前验证路由控制器文件的存在。我已将中间件添加到 Http 内核文件中的 $routeMiddleware

在检查文件是否存在之前,我如何完成此操作?

我考虑过将它添加到应用程序全局中间件,但我不希望它 运行 仅在网络上 api 调用

问题是 uses 实际上试图检索一个 class 然后调用里面的方法,你 不应该被鼓励在那里放置任何参数 所以不要这样做,而是尝试将 api 路线分组在某些 prefixmiddleware 下,如下所示:

Route::prefix('XXXXXXX')->group(['middleware' => ['api-version']], function() {
    Route::get('/endoint', 'EndpointController@endpoint');
});

注意: 我的上述假设是因为您没有正确处理中间件 class 内部的更改 {api-namespace}

单步执行代码让我看到这已经由 Laravel 处理,我需要做的就是创建一个 routes/api/v2.php 文件,其中包含版本的路由2. 我看到的唯一问题是必须复制所有未从版本 1 更改为版本 2 的路由。我可能会考虑修改我的 RouteServiceProvider 以实际继承以前的版本,如果它们没有在请求的 api 版本中被覆盖而不是为每个 api 版本复制路由代码。

为下一个版本创建不同的文件 API 有一些缺点。 您必须从版本 1

创建所有路由

在我的例子中,版本 2 只是对 3 个请求的一些更改。那时我觉得我们需要对这种操作进行回退。

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

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