Я унаследовал приложение 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
, создав fre sh маршруты для этих вызовов API. Это потребует репликации этих существующих функций в пространстве имен Admin. - Используйте существующие функции в пространстве имен Admin. Создайте отдельную группу маршрутов в файле
routes.php
, которая использует пространство имен Admin, но промежуточное ПО auth:api
вместо обычного промежуточного ПО web
. Маршрут в этом будет похож на тот, который уже существовал в группе маршрутов администратора. Это не потребовало бы написания намного более нового кода по сравнению с другим вариантом.
Я пробовал оба решения, и оба работают. Я могу хранить данные в базе данных. Но я должен выполнить этот вызов API, чтобы получить огромный объем данных для статистических целей, и вставка большого количества кода только для этого не кажется правильной, когда у меня уже есть функции, выполняющие ту же задачу. Отсюда и вопрос, который здесь задают.
Может кто-нибудь сказать, какой подход из двух приведенных выше лучше? И есть ли проблемы безопасности с любым из этих параметров?
Вот мой код.
Опция 1:
routes.php
file
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');
});
});