Laravel: Web и API — одинаковые или разные контроллеры?

Источник: «Laravel Web and API: Same or Separate Controllers?»
Вы можете столкнуться с ситуацией, когда нужно вернуть одни и те же данные для 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».

Дополнительные материалы

Предыдущая Статья

Laravel: Как автоматически вернуть JSON для Eloquent

Следующая Статья

CSRF: Как предотвратить уязвимость