Маршрутизация и контроллеры в Laravel
Студент научится настраивать маршруты приложения в web.php и создавать контроллеры для обработки HTTP-запросов пользователя.
Основы маршрутизации. Жизненный цикл запроса в Laravel начинается с маршрутизатора. Файл routes/web.php действует как диспетчер, который анализирует URL, введенный пользователем, и определяет, какой код должен быть выполнен. Маршрутизатор позволяет определять пути для различных HTTP-методов: GET (получение данных, просмотр страницы), POST (отправка данных формы, создание ресурса), PUT/PATCH (обновление) и DELETE. Например, маршрут Route::get('/products', ...) сработает, когда клиент зайдет на страницу каталога. В Laravel можно передавать логику прямо в маршрут с помощью анонимной функции (Closure), но для сложных систем, таких как интернет-магазин, это считается антипаттерном. Вместо этого мы связываем маршруты с методами контроллеров. Маршруты также поддерживают передачу параметров. Если мы хотим просмотреть конкретный товар, мы создаем маршрут вида Route::get('/product/{id}', ...), где {id} — это динамический сегмент URL, который будет передан в качестве аргумента в метод контроллера. Метод Project-Based Learning требует от нас сразу связывать теорию с практикой: все URL нашего магазина должны быть человекопонятными (ЧПУ).
php
// routes/web.php
use App\Http\Controllers\ProductController;
// Базовый маршрут для главной страницы
Route::get('/', function () {
return view('welcome');
});
// Маршрут каталога товаров, привязанный к контроллеру
Route::get('/products', [ProductController::class, 'index'])->name('products.index');
Контроллеры и их создание. Контроллеры группируют связанную логику обработки запросов в один класс. Для генерации контроллера мы используем консольную утилиту Artisan: php artisan make:controller ProductController. Внутри контроллера мы создаем методы (actions), которые соответствуют маршрутам. Стандартный набор методов для CRUD-операций (Create, Read, Update, Delete) включает: index (вывод списка), show (вывод одного элемента), create (форма создания), store (сохранение в БД), edit (форма редактирования), update (обновление) и destroy (удаление). В методе index контроллера ProductController мы обращаемся к базе данных (позже через модель), получаем массив товаров и передаем его в функцию view(), которая рендерит HTML-шаблон. Использование функции name('products.index') при определении маршрута — это лучшая практика. Именованные маршруты позволяют генерировать URL в шаблонах с помощью функции route('products.index'). Если в будущем мы решим изменить URL с '/products' на '/catalog', нам нужно будет изменить это только в одном месте (в web.php), а все ссылки в шаблонах обновятся автоматически.
php
// app/Http/Controllers/ProductController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProductController extends Controller {
public function index() {
// Временный массив данных для примера (до изучения БД)
$products = [
['id' => 1, 'name' => 'Laptop', 'price' => 1000],
['id' => 2, 'name' => 'Smartphone', 'price' => 500]
];
return view('products.index', ['products' => $products]);
}
}
Middleware (Посредники) и защита маршрутов. Middleware — это механизм фильтрации HTTP-запросов, поступающих в ваше приложение. Представьте его как контрольно-пропускной пункт. Если пользователь пытается получить доступ к странице оформления заказа (/checkout) или своему профилю (/profile), система должна убедиться, что он авторизован. В Laravel для этого есть встроенный middleware с именем 'auth'. Мы можем применять middleware к отдельным маршрутам или объединять маршруты в группы. Использование Route::middleware('auth')->group(...) позволяет применить проверку авторизации сразу к нескольким путям. Если неавторизованный гость попытается зайти на такой маршрут, middleware 'auth' перехватит запрос и автоматически перенаправит его на страницу логина (login route). Это избавляет нас от необходимости писать проверки авторизации (if (!Auth::check())) внутри каждого метода контроллера, сохраняя код чистым и соответствующим принципу DRY (Don't Repeat Yourself).
php
// routes/web.php (Защита маршрутов профиля и оформления заказа)
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\CheckoutController;
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'])->name('checkout.process');
});