Управление версиями 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, который добавляет резервные функции к маршрутам. Мне лично это было нужно давно, но я не понимал, что это будет достигнуто с помощью такого крошечного пакета.
Проблема в том, что uses
на самом деле пытается получить class
и затем вызовите метод внутри, вам не следует предлагать помещать туда какие-либо параметры, поэтому воздержитесь от этого, вместо этого попробуйте сгруппировать маршруты API под определенным prefix
а также middleware
вот так:
Route::prefix('XXXXXXX')->group(['middleware' => ['api-version']], function() {
Route::get('/endoint', 'EndpointController@endpoint');
});
Примечание. Мое вышеизложенное предположение основано на том, что вы не справились с изменением {api-namespace}
внутри вашего промежуточного класса должным образом.