Управление версиями API в laravel: маршрутизация в зависимости от заголовка Accept

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

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

Спасибо.


person leamasuero    schedule 06.03.2015    source источник
comment
Я боролся с этой же проблемой, и я также хотел бы сделать так, чтобы маршруты v2 переопределялись, поэтому, если для /action не определен явный маршрут v2, он попадет на маршрут v1. Пожалуйста, обновите этот пост любыми выводами/решениями - я бы очень хотел следить за прогрессом.   -  person Matt Klinker    schedule 08.03.2015


Ответы (1)


Я думаю, вы можете попробовать что-то подобное на своем route.php, который я не тестировал, но должен работать

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

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

И в файлах route_v....php определите маршруты, как обычно.

ОБНОВИТЬ

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

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

person astroanu    schedule 17.03.2015
comment
да не будет, ни маршруты с закрытием. dingo/api прекрасно решил эту проблему для своих маршрутов API. - person astroanu; 25.08.2015