1

我正在尝试为我正在处理的 API 设置 api 版本,我发现这篇文章解释了如何使用中间件并替换路由本身中的字符串。基本上指定这样的路线。

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

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

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

在运行执行替换的中间件之前,容器似乎正在验证路由控制器文件的存在。我已将中间件添加到$routeMiddlewareHttp Kernel 文件中。

在检查文件是否存在之前,我怎样才能做到这一点?

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

4

3 回答 3

1

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

在我的情况下,版本 2 只是对 3 个请求的一些更改。那是我觉得我们需要为这种操作提供后备的时候。

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

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

于 2020-07-06T10:32:32.520 回答
0

问题是uses实际上试图检索 aclass然后调用里面的方法,不应该鼓励你把任何参数放在那里,所以不要这样做,而是尝试将你的 api 路由分组prefix如下middleware

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

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

于 2018-02-09T17:44:19.940 回答
0

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

于 2018-02-09T21:59:21.910 回答