Маршрутизация и контроллеры в Laravel
Создание маршрутов, обработка HTTP-запросов и передача данных из контроллеров в представления.
Маршрутизация (Routing) — это механизм, который сопоставляет входящие HTTP-запросы (URL в браузере) с конкретным кодом вашего приложения, который должен этот запрос обработать. В Laravel все веб-маршруты регистрируются в файле routes/web.php. Маршрутизатор Laravel поддерживает все основные HTTP-глаголы: GET (для получения данных, например, страницы каталога), POST (для отправки данных, например, формы оформления заказа), PUT/PATCH (для обновления) и DELETE. Самый простой маршрут может возвращать строку или представление напрямую, но в архитектуре MVC маршруты обычно указывают на методы контроллеров.
При создании интернет-магазина мы активно используем группировку маршрутов и Middleware (Посредники). Middleware — это слой кода, который фильтрует входящие запросы. Например, мы не хотим, чтобы неавторизованный гость мог зайти на страницу профиля или завершить оформление заказа. Как показано в упражнении 3.1 из нашего архива, мы можем использовать middleware auth для защиты группы маршрутов. Если гость попытается зайти на /checkout, middleware автоматически перенаправит его на страницу логина. Маршрутам также принято давать имена (метод name()), чтобы в шаблонах можно было генерировать ссылки динамически с помощью функции route('checkout.index'), а не жестко прописывать URL /checkout.
Контроллеры в Laravel группируют связанную логику обработки запросов в один класс. Они хранятся в app/Http/Controllers. Для генерации контроллера используется интерфейс командной строки Artisan: php artisan make:controller ProductController. Внутри контроллера мы создаем методы (экшены), такие как index() для показа списка, show() для показа одного товара, store() для сохранения. Контроллер часто работает с объектом класса Illuminate\Http\Request, который Laravel автоматически внедряет (Dependency Injection) в метод. Этот объект содержит все данные текущего запроса: параметры из URL, данные из POST-форм, загруженные файлы и сессии.
Рассмотрим пример добавления товара в корзину (из упражнения 2.1). Метод add(Request $request) в CartController извлекает product_id из запроса: $request->input('product_id'). Затем он обращается к фасаду сессии (Session), чтобы получить текущее состояние корзины, обновляет количество товара и сохраняет массив обратно в сессию, после чего делает редирект (перенаправление) пользователя назад с сообщением об успехе. Это классический пример 'тонкого' контроллера, который координирует действия между HTTP-запросом, хранилищем сессий и HTTP-ответом.
// Файл: routes/web.php
use App\Http\Controllers\ProductController;
use App\Http\Controllers\CheckoutController;
use App\Http\Controllers\ProfileController;
// Публичный маршрут для всех
Route::get('/products', [ProductController::class, 'index'])->name('products.index');
// Защищенные маршруты (доступны только авторизованным)
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'index'])->name('profile');
Route::get('/checkout', [CheckoutController::class, 'index'])->name('checkout');
Route::post('/checkout', [CheckoutController::class, 'process']);
});
// Файл: app/Http/Controllers/ProductController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// Подключение модели (изучим в 10 уроке)
// use App\Models\Product;
class ProductController extends Controller {
public function index() {
// Эмуляция получения товаров из БД (Упражнение 3.1)
$products = [
['id' => 1, 'name' => 'Laptop', 'price' => 1000],
['id' => 2, 'name' => 'Smartphone', 'price' => 500]
];
// Передача массива $products в представление resources/views/products/index.blade.php
return view('products.index', ['products' => $products]);
}
}
Какая функция используется в файле web.php для применения фильтра (например, проверки авторизации) к маршруту или группе маршрутов?
Напишите команду Artisan для создания контроллера с именем CartController.
Флеш-карточки
Где регистрируются веб-маршруты в приложении Laravel?
Нажмите, чтобы увидеть ответ
В файле routes/web.php
Нажмите, чтобы вернуться
Какой класс позволяет получить данные из POST-формы внутри контроллера?
Нажмите, чтобы увидеть ответ
Класс Illuminate\Http\Request
Нажмите, чтобы вернуться