Уроки курса
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 (без сохранения состояния). Это значит, что каждый запрос к серверу независим, и сервер по умолчанию не помнит, что вы делали секунду назад. Чтобы интернет-магазин работал, нам нужен механизм запоминания товаров, которые пользователь добавил в корзину, пока он бродит по каталогу. Для этого используются Сессии (Sessions).

Сессия — это хранилище данных на стороне сервера, привязанное к конкретному пользователю через уникальный идентификатор (cookie), который хранится в браузере. В Laravel работа с сессиями абстрагирована: мы можем использовать файловую систему, базу данных или Redis для хранения сессий, не меняя код контроллеров. Мы будем использовать фасад session(). Корзина будет представлять собой ассоциативный массив, где ключом является ID товара, а значением — массив с его названием, ценой и количеством.

php
// App\Http\Controllers\CartController.php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;

class CartController extends Controller {
    public function add(Request $request) {
        $productId = $request->input('product_id');
        // Получаем текущую корзину из сессии или пустой массив, если ее нет
        $cart = session()->get('cart', []);

        // Если товар уже в корзине, просто увеличиваем количество
        if (isset($cart[$productId])) {
            $cart[$productId]['quantity']++;
        } else {
            // Если товара нет, находим его в БД и добавляем в массив
            $product = Product::findOrFail($productId);
            $cart[$productId] = [
                'name' => $product->name,
                'price' => $product->price,
                'quantity' => 1
            ];
        }
        
        // Сохраняем обновленный массив обратно в сессию
        session()->put('cart', $cart);
        return redirect()->back()->with('success', 'Товар добавлен в корзину');
    }
}

Детальный разбор метода добавления в корзину

Код, представленный выше (из наших архивных упражнений), демонстрирует классический паттерн работы с корзиной в сессии. Обратите внимание на использование метода findOrFail($productId). Это отличная практика: если злоумышленник попытается отправить POST-запрос с несуществующим ID товара, Laravel автоматически выбросит исключение ModelNotFoundException и вернет пользователю страницу 404, прервав выполнение скрипта.

Почему мы храним имя и цену в сессии? Может показаться логичным хранить в сессии только ID товара и его количество, а имя и цену каждый раз брать из БД. Однако хранение базовых данных (имя, цена) в сессии снижает количество запросов к БД при отображении корзины на каждой странице сайта (например, в виджете хедера). Главное правило — при финальном оформлении заказа (Checkout) цену обязательно нужно перепроверять по базе данных, чтобы избежать манипуляций со стороны клиента.

Почему при добавлении нового товара в корзину используется метод Product::findOrFail() вместо Product::find()?

Отображение корзины и подсчет Итого (Total)

Для вывода корзины мы создадим метод index() в CartController, который будет передавать массив session('cart') в представление. В шаблоне Blade мы пройдемся по этому массиву циклом. Одной из частых задач является подсчет общей суммы корзины. Мы можем сделать это прямо в контроллере или в шаблоне.

В PHP есть элегантные способы работы с массивами. Вместо написания цикла foreach для подсчета суммы, мы можем использовать комбинацию функций array_map и array_sum (что мы увидим в следующем уроке при оформлении заказа). Но для отображения в Blade часто достаточно просто умножить цену на количество внутри цикла вывода товаров и прибавлять к промежуточной переменной.

Реализация методов обновления и удаления

Полноценная корзина требует возможности изменять количество товаров и удалять их.

  • Создайте маршрут POST /cart/remove и метод remove(Request $request) в CartController.
  • В методе remove получите ID товара, проверьте его наличие в session('cart') с помощью isset().
  • Используйте функцию unset($cart[$productId]) для удаления элемента массива.
  • Сохраните обновленный массив в сессию через session()->put().
  • Добавьте кнопку 'Удалить' в Blade-шаблон корзины.
10 баллов