Управление несколькими версиями API в Laravel

#laravel #api #rest

#laravel #API #rest

Вопрос:

Я работаю над предоставлением API с использованием одного базового URL (напримерhttps://api.domain.com ) и наличие этого URL-адреса для обработки всех версий API (потребителю API нужно будет отправить Accept-Version в заголовке запроса, чтобы указать, какую версию API они пытаются использовать).

Как бы я управлял этим подходом в Laravel?

Я думал, что мог бы разместить все свои контроллеры, помощники, модели, маршруты, конфигурацию и т.д. скажем, в 1.0.0 папке и использовать их для версии 1 моего API. Когда я выпускаю новую версию, возможно, я делаю копии исходного кода, помещаю их в 1.1.0 папку и вношу в нее изменения.

Если бы я использовал этот подход к папке, что мне нужно было бы сделать в маршрутах, чтобы указать, какую папку использовать? Как мои контроллеры узнают, какие модели, помощники, конфигурация и т.д. как использовать? Похоже, что этот подход может стать очень грязным и запутанным.

Ответ №1:

В вашем RouteServiceProvider.php вы можете определить маршруты для приложения. Здесь вы также можете определить пространство имен, префикс имени и промежуточное программное обеспечение для маршрутов. Просто добавьте новую карту маршрутов для каждой версии вашего API. Попросите промежуточное программное обеспечение проверить версию, перенаправив при необходимости, и установите префикс имени / пространство имен в правильный каталог версии.

RouteServiceProvider будет выглядеть примерно так:

 protected function mapApi-1-0-0-Routes()
{
    Route::middleware(['api', 'version'])
        ->name('1.0.0.')
        ->namespace('1.0.0')
        ->group(base_path('routes/api.php'));
}
  

тогда ваш middleware будет выглядеть примерно так

 public function handle($request, Closure $next)
{
    switch ($request->version) {
        case "1.0.0":
            $route = $request->version.$request->route()->getName();
            break;
        // more versions

    return redirect()->route($route)->with($request);
}
  

Я не тестировал это.

Префиксы имен групп маршрутов:https://laravel.com/docs/7.x/routing#route-group-name-prefixes

Пространства имен маршрутов:https://laravel.com/docs/7.x/routing#route-group-namespaces

Перенаправление именованных маршрутов:https://laravel.com/docs/7.x/redirects#redirecting-named-routes

Глобальное промежуточное программное обеспечение:https://laravel.com/docs/7.x/middleware#global-middleware

Написание поставщиков услуг:https://laravel.com/docs/7.x/providers#writing-service-providers