Уроки курса
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%

Концепция сессий в веб-разработке

Протокол HTTP является 'stateless' (без сохранения состояния). Это означает, что сервер не помнит вас между запросами. Когда вы добавляете товар в корзину (запрос 1) и переходите на страницу оформления (запрос 2), сервер должен как-то связать эти два запроса с одним пользователем. Для этого используются Сессии. В Laravel фасад Session предоставляет удобный интерфейс для работы с сессионными данными. Для корзины покупок мы будем использовать массив внутри сессии, где ключом будет ID товара, а значением — массив с данными (имя, цена, количество). Почему сессии, а не база данных? Для гостевых пользователей сессии — идеальный вариант, так как не перегружают БД 'мусорными' корзинами, которые никогда не дойдут до оформления. Принцип Scaffolding: сначала мы создадим простую корзину в сессии, а в будущем вы сможете расширить логику, перенося корзину в БД при авторизации пользователя.

Логика добавления товара

Рассмотрим процесс добавления товара. В контроллере CartController метод add() принимает Request, содержащий product_id. Сначала мы извлекаем текущую корзину из сессии с помощью session()->get('cart', []). Второй аргумент — пустой массив, который вернется, если корзина еще пуста. Далее идет ключевая бизнес-логика: мы проверяем, есть ли уже товар с таким ID в массиве $cart. Если есть (isset($cart[$productId])), мы просто увеличиваем счетчик 'quantity'. Если нет, мы делаем запрос к БД через Product::findOrFail($productId), чтобы получить актуальную цену и название товара, и формируем новый элемент массива. Зачем брать цену из БД, а не передавать из HTML-формы? Это защита от злоумышленников! Если передавать цену из формы, хакер может изменить HTML-код в браузере (через Inspect Element), установить цену 1 копейку и отправить запрос. Всегда доверяйте только данным из вашего бэкенда.

php
public function add(Request $request) {
    $productId = $request->input('product_id');
    $cart = session()->get('cart', []);

    if (isset($cart[$productId])) {
        $cart[$productId]['quantity']++;
    } else {
        $product = \App\Models\Product::findOrFail($productId);
        $cart[$productId] = [
            'name' => $product->name,
            'price' => $product->price,
            'quantity' => 1
        ];
    }
    
    session()->put('cart', $cart);
    return redirect()->back()->with('success', 'Товар добавлен в корзину');
}

Вычисление итоговой суммы (Total)

Когда пользователь переходит на страницу корзины, нам необходимо отобразить все товары и посчитать итоговую сумму заказа. В методе index() контроллера CartController мы передаем содержимое сессии в представление. Для расчета суммы можно использовать встроенные функции PHP. В архивных материалах (Упражнение 1.1, Раздел 1) показан отличный пример с использованием array_sum и array_map. Суть в том, чтобы умножить цену каждого товара на его количество, а затем сложить полученные значения. В Blade-шаблоне вы можете перебрать корзину через @foreach(session('cart', []) as $id => $details) и вывести данные. Важно также реализовать методы для удаления конкретного товара (используя unset($cart[$id])) и полного очищения корзины (session()->forget('cart')).

Хранилище Плюсы Минусы
Сессии (Sessions) Быстрота работы, не требует запросов к БД, идеально для гостей. Очищается при закрытии браузера (или истечении lifetime), корзина не синхронизируется между устройствами.
База Данных (DB) Корзина сохраняется навсегда, доступна с мобильного и ПК, аналитика брошенных корзин. Требует авторизации пользователя, увеличивает нагрузку на базу данных при каждом чихе.

Почему при добавлении товара в корзину цену необходимо брать из базы данных (Product::findOrFail), а не из скрытого поля (input type='hidden') HTML-формы?

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