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

Реализация корзины покупок через сессии

Добавление, удаление товаров и изменение их количества в корзине с использованием механизма сессий. Применение Mastery Learning для безошибочного управления состоянием.

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

Корзина покупок — это временное хранилище выбранных пользователем товаров до момента оформления заказа. В архитектуре веб-приложений существует несколько способов хранения корзины: в базе данных, в локальном хранилище браузера (LocalStorage) или в HTTP-сессиях на сервере. Мы будем использовать механизм Сессий Laravel. Сессия позволяет сохранять данные (состояние) между различными HTTP-запросами одного и того же пользователя. Поскольку протокол HTTP по своей природе 'stateless' (не сохраняет состояние), сессии используют уникальный идентификатор (cookie), который передается с каждым запросом, чтобы сервер понимал, чья это корзина. Применяя методологию Mastery Learning, мы не будем переходить к оформлению заказа, пока полностью не отладим логику добавления, обновления и удаления элементов из сессионного массива корзины. Структура нашей корзины в сессии будет представлять собой ассоциативный массив, где ключом является ID товара, а значением — массив с его названием, ценой и количеством.

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');
        $product = Product::findOrFail($productId);
        
        // Получаем текущую корзину из сессии или пустой массив
        $cart = session()->get('cart', []);

        // Если товар уже есть в корзине, увеличиваем количество
        if (isset($cart[$productId])) {
            $cart[$productId]['quantity']++;
        } else {
            // Если нет, добавляем новый элемент
            $cart[$productId] = [
                'name' => $product->name,
                'price' => $product->price,
                'quantity' => 1
            ];
        }

        // Сохраняем обновленный массив обратно в сессию
        session()->put('cart', $cart);

        return redirect()->back()->with('success', 'Товар добавлен в корзину');
    }
}

Давайте детально разберем метод add. Сначала мы получаем ID товара из POST-запроса через $request->input('product_id'). Затем мы проверяем, существует ли такой товар в базе данных с помощью findOrFail (чтобы избежать добавления несуществующих товаров злоумышленниками). Ключевой момент — работа с сессией: session()->get('cart', []). Второй аргумент [] означает 'дефолтное значение'. Если корзины в сессии еще нет, метод вернет пустой массив. Далее мы проверяем с помощью функции isset(), есть ли уже ключ с ID этого товара в массиве. Если да, мы просто инкрементируем счетчик quantity. Если товара нет, мы создаем новый вложенный массив с данными товара. Важно: мы сохраняем цену в момент добавления в корзину! Это защитит нас от ситуаций, когда администратор изменил цену в каталоге, пока товар лежал у пользователя в корзине. В конце мы используем метод session()->put() для перезаписи корзины и редирект с флеш-сообщением об успехе.

php
    // Метод удаления товара из корзины
    public function remove(Request $request)
    {
        $productId = $request->input('product_id');
        $cart = session()->get('cart');

        if (isset($cart[$productId])) {
            unset($cart[$productId]);
            session()->put('cart', $cart);
        }

        return redirect()->route('cart.index')->with('success', 'Товар удален');
    }

    // Метод очистки всей корзины
    public function clear()
    {
        session()->forget('cart');
        return redirect()->route('cart.index');
    }

Функции удаления и очистки работают по аналогичному принципу. Для удаления конкретного товара мы используем стандартную функцию PHP unset(), которая удаляет элемент массива по его ключу. После удаления мы обязательно должны сохранить измененный массив обратно в сессию с помощью session()->put(). Типичная ошибка: разработчики делают unset, но забывают обновить сессию, в результате чего товар 'возвращается' при обновлении страницы. Для полной очистки корзины Laravel предоставляет удобный метод session()->forget('cart'), который полностью удаляет ключ 'cart' из хранилища сессий. Этот метод нам также очень пригодится в следующем уроке, когда после успешного оформления заказа нам нужно будет опустошить корзину пользователя.

Сценарий: Реализация контроллера корзины

Создайте полноценный CartController для обработки корзины.

  • Выполните команду php artisan make:controller CartController.
  • Добавьте метод index() для вывода содержимого session()->get('cart').
  • Реализуйте метод add(Request $request) согласно примерам выше.
  • Зарегистрируйте маршруты (GET /cart, POST /cart/add, POST /cart/remove) в routes/web.php.
10 баллов

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