Опубликовано:
Laravel: Web и API — одинаковые или разные контроллеры?
Вы можете столкнуться с ситуацией, когда нужно вернуть одни и те же данные для web и для API. Должно ли это быть в одном или разных контроллерах? Есть несколько способов решения.
Вариант 1. Один Контроллер с Параметром
app/Http/Controllers/UserController.php
:
class UserController extends Controller {
public function index($format = 'view') {
$users = User::all();
if ($format == 'view') {
return view('users.index', compact('users'));
} else {
return response()->json($users); // или используем API Ресурсы
}
}
}
Вариант 2. Контроллер с Заголовком
Контроллер может определить, что возвращать, на основе заголовка запроса. Ваш фронтенд клиент может передать запрос, например с помощью Accept: application/json
. Затем вы можете сделать:
use Illuminate\Http\Request;
class UserController extends Controller {
public function index(Request $request) {
$users = User::all();
if ($request->expectsJson()) {
return response()->json($users);
} else {
return view('users.index', compact('users'));
}
}
}
Вариант 3. Отдельные контроллеры
Смешивать web и api может быть плохой практикой, поскольку это противоречит принципу Разделения интересов
: они служат разным целям, поэтому их следует разделять.
app/Http/Controllers/UserController.php
:
class UserController extends Controller {
public function index() {
$users = User::all();
return view('users.index', compact('users'));
}
}
routes/web.php
:
use App\Http\Controllers\UserController;
Route::get('users', [UserController::class, 'index']);
app/Http/Controllers/Api/UserController.php
:
class UserController extends Controller {
public function index() {
$users = User::all();
return response()->json($users);
}
}
routes/api.php
:
use App\Http\Controllers\Api\UserController;
Route::get('users', [UserController::class, 'index']);
Затем к веб-странице можно получить доступ с помощью /users
, а конечную точку API можно вызвать с помощью /api/users
, поскольку все маршруты в файле route/api.php
автоматически получают префикс «api».