Версии API в laravel: маршрутизация в зависимости от & quot; Принять & quot; заголовок

Поскольку я хочу запускать конечные точки после принятия заголовка, я создал промежуточное программное обеспечение, чтобы определить, какая версия использует клиент:

// 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} значение. Есть ли какой-нибудь другой способ узнать, какой контроллер следует запустить?

Благодарю.

5

Решение

Я думаю, вы можете попробовать что-то подобное на вашем маршрутах. Я не проверял, но должен работать

switch (Request::header('api-version')) {
case 'v2':
include_once('routes_v2.php');
break;

default:
include_once('routes_v1.php');
}

А в файлах route_v …. php задайте маршруты, как вы это обычно делаете.

ОБНОВИТЬ

Правильный способ сделать это будет в функции карты RouteServiceProvider. У вас будет только два файла маршрута.

Вы можете легко управлять несколькими версиями apis в пакете dingo / api. Это сэкономит вам много времени.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]