Api laravel 中的版本控制:路由取决于 "Accept" Header
Api versioning in laravel: routing depending on the "Accept" Header
因为我想在接受 header 时触发端点,我创建了一个中间件来识别哪个版本正在使用客户端:
// 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 class 中注册中间件而不是分组路由定义,但它没有用。
我想知道是否有更好的方法来实现 API 版本控制。
- 我想为每个版本创建一个
routes.php
文件:v1-routes.php
、v2-routes.php
等等。
- 我不喜欢将路由定义分组到
routes.php
中只是为了访问 {api}
值的想法。还有其他方法可以找出我应该触发哪个控制器吗?
谢谢。
我想你可以在你的 routes.php 上尝试类似的东西我还没有测试过但应该可以工作
switch (Request::header('api-version')) {
case 'v2':
include_once('routes_v2.php');
break;
default:
include_once('routes_v1.php');
}
并且在 route_v.....php 文件中像往常一样定义路由。
更新
执行此操作的正确方法是在 RouteServiceProvider 的映射函数中。您将只有两个路由文件。
您可以在dingo/api包中轻松管理多个版本的api。这将为您节省很多时间。
因为我想在接受 header 时触发端点,我创建了一个中间件来识别哪个版本正在使用客户端:
// 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 class 中注册中间件而不是分组路由定义,但它没有用。
我想知道是否有更好的方法来实现 API 版本控制。
- 我想为每个版本创建一个
routes.php
文件:v1-routes.php
、v2-routes.php
等等。 - 我不喜欢将路由定义分组到
routes.php
中只是为了访问{api}
值的想法。还有其他方法可以找出我应该触发哪个控制器吗?
谢谢。
我想你可以在你的 routes.php 上尝试类似的东西我还没有测试过但应该可以工作
switch (Request::header('api-version')) {
case 'v2':
include_once('routes_v2.php');
break;
default:
include_once('routes_v1.php');
}
并且在 route_v.....php 文件中像往常一样定义路由。
更新
执行此操作的正确方法是在 RouteServiceProvider 的映射函数中。您将只有两个路由文件。
您可以在dingo/api包中轻松管理多个版本的api。这将为您节省很多时间。