Управление версиями API Laravel 5.3

Я пытаюсь установить API-версию для API, над которым я работаю. Я нашел этот пост, в котором объяснялось, как сделать это с помощью промежуточного программного обеспечения и заменить строку в самом маршруте. По сути, указание таких маршрутов.

Route::group(['middleware' => ['api-version']], function() {
  Route::get('/endoint', ['uses' => '{api-namespace}\EndpointController@endpoint']);
});

Однако, когда я пытаюсь это сделать, я получаю следующую ошибку

Class App\Http\Controllers\{api-namespace}\EndpointController does not exist

Может показаться, что контейнер проверяет наличие файлов контроллера маршрута перед запуском промежуточного программного обеспечения, которое выполняет замену. Я добавил промежуточное программное обеспечение для $routeMiddleware в файле ядра HTTP.

Как я могу сделать это, прежде чем он проверяет наличие файла?

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

2 ответа

Решение

Проход по коду позволил мне увидеть, что это уже обработано Laravel, и все, что мне нужно было сделать, это создать файл route /api/v2.php с маршрутами для версии 2. Единственная проблема, которую я вижу, - это дублирование всех маршрутов. который не изменился с версии 1 на версию 2. Я могу изучить изменение моего RouteServiceProvider для фактического наследования предыдущих версий, если они не переопределены в запрашиваемой версии API, вместо дублирования кода маршрутов для каждой версии API.

Создание другого файла для следующей версии API имеет некоторые недостатки. Вы должны создать все маршруты из версии 1

и в моем случае версия 2 была всего лишь некоторыми изменениями в 3 запросах. именно тогда я почувствовал, что нам нужен запасной вариант для такого рода операций.

затем я создал простой пакет Laravel для поддержки управления версиями Laravel API, который добавляет резервные функции к маршрутам. Мне лично это было нужно давно, но я не понимал, что это будет достигнуто с помощью такого крошечного пакета.

https://github.com/mbpcoder/laravel-api-versioning

Проблема в том, что uses на самом деле пытается получить class и затем вызовите метод внутри, вам не следует предлагать помещать туда какие-либо параметры, поэтому воздержитесь от этого, вместо этого попробуйте сгруппировать маршруты API под определенным prefix а также middleware вот так:

Route::prefix('XXXXXXX')->group(['middleware' => ['api-version']], function() {
    Route::get('/endoint', 'EndpointController@endpoint');
});

Примечание. Мое вышеизложенное предположение основано на том, что вы не справились с изменением {api-namespace} внутри вашего промежуточного класса должным образом.

Другие вопросы по тегам