Уроки курса
1 Основы синтаксиса PHP 8
60 мин
2 Функции и управляющие конструкции
60 мин
3 Объектно-ориентированное программирование на PHP
60 мин
4 Наследование, интерфейсы и полиморфизм
60 мин
5 Основы баз данных MySQL и работа через PDO
60 мин
6 Архитектурный паттерн MVC
60 мин
7 Введение в Laravel и настройка окружения
60 мин
8 Маршрутизация и контроллеры в Laravel
60 мин
9 Шаблонизатор Blade и создание интерфейса
60 мин
10 Миграции баз данных и Eloquent ORM
60 мин
11 Связи моделей в Eloquent — Настройка связей 'один …
60 мин
12 Аутентификация и защита маршрутов
60 мин
13 Разработка каталога товаров и категорий
60 мин
14 Реализация корзины покупок через сессии
60 мин
15 Оформление заказа и транзакции базы данных
60 мин
16 Интеграция платежной системы Stripe
60 мин
17 Интеграция платежной системы Vipps
60 мин
18 Разработка панели администратора
60 мин
19 Оптимизация и подготовка к production
60 мин
20 Деплой Laravel-приложения на сервер
60 мин
21 Основы PHP 8: Синтаксис, переменные и управляющие конструкции
60 мин
22 Функции и массивы в PHP 8
60 мин
23 Объектно-ориентированное программирование: Классы и объекты
60 мин
24 Продвинутое ООП: Наследование, интерфейсы и полиморфизм
60 мин
25 Основы баз данных: Проектирование БД и работа с …
60 мин
26 Взаимодействие PHP с MySQL через PDO
60 мин
27 Архитектура MVC и введение в фреймворк Laravel
60 мин
28 Маршрутизация и контроллеры в Laravel
60 мин
29 Шаблонизатор Blade: Создание пользовательского интерфейса
60 мин
30 Миграции и Eloquent ORM: Создание таблиц товаров
60 мин
31 Связи в Eloquent ORM: Отношения между моделями
60 мин
32 Аутентификация и авторизация пользователей
60 мин
33 Разработка каталога товаров: Вывод, фильтрация и пагинация
60 мин
34 Реализация корзины покупок с использованием сессий
60 мин
35 Оформление заказа: Работа с формами и валидация
60 мин
36 Транзакции базы данных: Сохранение заказа
60 мин
37 Интеграция платежной системы Stripe
60 мин
38 Интеграция платежной системы Vipps
60 мин
39 Создание панели администратора
60 мин
40 Подготовка к production и деплой приложения
60 мин
41 Основы PHP 8 и синтаксис
60 мин
42 Объектно-ориентированное программирование на PHP
60 мин
43 Продвинутое ООП и интерфейсы
60 мин
44 Основы баз данных и MySQL
60 мин
45 Архитектурный паттерн MVC
60 мин
46 Введение в Laravel и маршрутизация
60 мин
47 Шаблонизатор Blade и верстка интерфейса
60 мин
48 Миграции и структура базы данных
60 мин
49 Eloquent ORM и модели
60 мин
50 Отношения в Eloquent ORM
60 мин
51 Авторизация и защита маршрутов
60 мин
52 Создание каталога товаров
60 мин
53 Реализация корзины покупок
60 мин
54 Оформление заказа и транзакции БД
60 мин
55 Интеграция платежной системы Stripe
60 мин
56 Интеграция платежной системы Vipps
60 мин
57 Панель администратора: управление товарами
60 мин
58 Панель администратора: управление заказами
60 мин
59 Подготовка к production и деплой
60 мин
60 Запуск и тестирование готового интернет-магазина
60 мин

Оформление заказа: Работа с формами и валидация

Студент разработает страницу оформления заказа, настроит сбор контактных данных пользователя и их строгую валидацию на стороне сервера.

Прогресс урока: 0%

Процесс Checkout и Транзакции Базы Данных

Оформление заказа (Checkout) — самый критичный и сложный этап работы интернет-магазина. Здесь мы трансформируем временные данные из сессии (корзину) в постоянные записи базы данных. Процесс включает создание записи в таблице orders (общая информация о заказе) и множества записей в таблице order_items (товары в заказе).

Представьте ситуацию: скрипт успешно создал заказ в orders, затем начал добавлять товары в order_items, но на втором товаре сервер упал или база данных выдала ошибку. У нас появится "повисший" заказ с неполным списком товаров. Это катастрофа для бизнеса. Чтобы гарантировать атомарность операций (либо выполняется всё, либо ничего), мы обязаны использовать Транзакции базы данных (DB::transaction). Если внутри замыкания (closure) транзакции произойдет любое исключение (Exception), Laravel автоматически выполнит rollback (откат), и база данных вернется в исходное состояние.

php
// App\Http\Controllers\CheckoutController.php
use Illuminate\Support\Facades\DB;
use App\Models\Order;
use App\Models\OrderItem;
use Illuminate\Http\Request;

public function process(Request $request) {
    // 1. Получаем корзину и проверяем, не пуста ли она
    $cart = session('cart', []);
    if (empty($cart)) return redirect()->route('cart.index');

    // 2. Транзакция БД гарантирует целостность данных
    DB::transaction(function () use ($cart) {
        // Элегантный подсчет общей суммы (Total) из архива курса
        $total = array_sum(array_map(fn($item) => $item['price'] * $item['quantity'], $cart));
        
        // Создаем родительскую запись заказа
        $order = Order::create([
            'user_id' => auth()->id(), // Пользователь должен быть авторизован (middleware 'auth')
            'total_price' => $total,
            'status' => 'pending'
        ]);

        // Создаем дочерние записи для каждого товара
        foreach ($cart as $id => $item) {
            OrderItem::create([
                'order_id' => $order->id,
                'product_id' => $id,
                'quantity' => $item['quantity'],
                'price' => $item['price'] // Фиксируем цену на момент покупки!
            ]);
        }
    });

    // 3. Если транзакция успешна, очищаем корзину
    session()->forget('cart');
    return redirect()->route('orders.success');
}

Валидация входящих данных

В приведенном выше примере мы сфокусировались на сохранении данных корзины. Однако на странице оформления заказа мы также собираем данные от пользователя: адрес доставки, телефон, комментарий. Все эти данные приходят через объект Request и требуют строжайшей валидации. Если вы попытаетесь сохранить в базу данных строку длиной 500 символов в поле, ограниченное 255 символами, MySQL выбросит ошибку. Хуже того, отсутствие валидации открывает путь к XSS-атакам и SQL-инъекциям.

Laravel предоставляет метод $request->validate(). Если валидация не проходит, Laravel автоматически перенаправляет пользователя обратно на форму и передает переменные с сообщениями об ошибках (переменная $errors в Blade), а также сохраняет введенные данные в сессии (функция old() в Blade), чтобы пользователю не пришлось заполнять форму заново.

php
// Пример добавления валидации перед транзакцией
public function process(Request $request) {
    // Валидация адреса и телефона
    $validatedData = $request->validate([
        'address' => 'required|string|min:10|max:255',
        'phone'   => 'required|string|regex:/^\+?[0-9]{10,15}$/',
        'comment' => 'nullable|string|max:500',
    ]);

    $cart = session('cart', []);
    // ... код транзакции из предыдущего примера ...
    // При создании Order мы можем добавить: 'address' => $validatedData['address']
}

Зачем использовать DB::transaction при сохранении заказа и его товаров в базу данных?

Фиксация исторических данных

Обратите внимание на строку в коде: 'price' => $item['price'] при создании OrderItem. Это критическое правило проектирования e-commerce систем. Вы обязаны копировать цену из товара (или корзины) в сводную таблицу заказа на момент покупки. Почему? Представьте, что клиент купил ноутбук за $1000. Через месяц магазин устроил распродажу, и цена ноутбука в таблице products стала $800. Если в истории заказов вы будете выводить цену через связь $orderItem->product->price, клиент увидит, что он якобы купил товар за $800, и общая сумма заказа не сойдется. Заказ — это исторический документ, его данные не должны меняться при изменении цен в каталоге.

Какой метод фасада Session используется для полного удаления ключа (например, очистки корзины 'cart') после успешного оформления заказа?