【发布时间】:2015-05-08 02:58:03
【问题描述】:
因为我想在接受标头时触发端点,所以我创建了一个中间件来识别哪个版本正在使用客户端:
// 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}值的想法。还有其他方法可以找出我应该触发哪个控制器吗?
谢谢。
【问题讨论】:
-
我一直在为同样的问题而苦苦挣扎,我也想让 v2 路由被覆盖,所以如果没有为 /action 定义明确的 v2 路由,它会落入v1路线。请用任何发现/解决方案更新此帖子 - 我非常愿意跟随进展。
标签: php rest routing versioning laravel-5