Должен ли я использовать Laravel Controller в группе маршрутов промежуточного веб-ПО для ответа на вызовы API, используя отдельный маршрут с промежуточным ПО auth:api?
Я унаследовал приложение Laravel 5.4 на работе (очень хорошо написанное и сложное). Приложение имеет четыре группы маршрутов в соответствии с четырьмя разными конечными пользователями вroutes.php
файл. Все группы маршрутов имеют собственное пространство имен вApp\Http\Controllers
.
нравитьсяApp\Http\Controllers\Api
App\Http\Controllers\Admin
Мой вопрос касается двух групп маршрутов - Api и Admin. Основная часть кода находится в пространстве имен Admin, а пространство имен Api имеет меньшую долю. Прямо сейчас вызовы API из внешней среды используют группу маршрутов Api с использованием пространства имен Api, а веб-приложение работает через группу маршрутов Admin с использованием пространства имен Admin.
Мне нужно сделать вызовы API к приложению для получения данных GET/POST в базе данных. Те же задачи создания и извлечения отлично выполняются в веб-приложении в браузере, поскольку в одном из контроллеров в пространстве имен Admin есть функции для переноса из этих задач. Я хочу использовать эти существующие функции для выполнения новых вызовов API.
Я использую Postman для проверки этих вызовов API.
У меня есть два варианта:
- Создавайте новые функции для вызовов API в
ApiController
в пространстве имен Api. Используйте существующую группу маршрутов Api сauth:api
промежуточное ПО вroutes.php
файл, создав новые маршруты для этих вызовов API. Это потребует репликации существующих функций в пространстве имен Admin. - Используйте существующие функции в пространстве имен Admin. Создайте отдельную группу маршрутов в
routes.php
файл, который использует пространство имен Admin, ноauth:api
промежуточное ПО вместо обычногоweb
промежуточное ПО. Маршрут в этом случае будет похож на тот, который существовал ранее в группе маршрутов администратора. Это не потребует написания более нового кода по сравнению с другим вариантом.
Я пробовал оба решения, и оба работают. Я могу хранить данные в базе данных. Но мне нужно выполнить этот вызов API, чтобы получить огромное количество данных для целей статистики, и копирование и вставка большого количества кода только для этого не кажется правильным, когда у меня уже есть функции, выполняющие ту же задачу. Следовательно, здесь задается вопрос.
Может ли кто-нибудь сказать мне, какой подход из двух выше лучше? И есть ли проблемы с безопасностью при использовании любого из этих вариантов?
Вот мой код.
Опция 1:
routes.php
файл
Route::group(['domain' => getenv('API_URL') , 'namespace' => 'Api', 'middleware' => 'api-auth'], function () {
Route::match(['get', 'post'], 'v1/createTask1', 'ApiController@create_task1');
Route::match(['get', 'post'], 'v1/createTask2', 'ApiController@create_task2');
Route::match(['get', 'post'], 'v1/getStats', 'ApiController@get_stats_task');
);
Вариант 2:
routes.php
файл
// Routes for making API calls to the Web functions already present under the Admin namespace
Route::group(['domain' => getenv('API_URL') , 'namespace' => 'Admin', 'middleware' => 'api-auth'], function() {
Route::match(['get', 'post'], 'v1/controller1_prefix/create', 'Controller1@createAction');
Route::match(['get', 'post'], 'v1/controller2_prefix/create', 'Controller2@createAction');
Route::match(['get', 'post'], 'v1/controller3_prefix/fetchStats', 'Controller2@statsAction');
});
Route::group(['domain' => getenv('ADM_URL') , 'namespace' => 'Admin', 'middleware' => 'web'], function () {
Route::group(['middleware' => 'auth:admins'], function() {
Route::match(['get', 'post'], 'v1/controller3_prefix/fetchStats', 'Controller2@statsAction');
});
*** Whole lot of routes ***
Route::group(['middleware' => ['auth:admins', 'check-role:SUPER_ADMIN|ADMIN']], function() {
Route::match(['get', 'post'], 'v1/controller1_prefix/create', 'Controller1@createAction');
Route::match(['get', 'post'], 'v1/controller2_prefix/create', 'Controller2@createAction');
});
});