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

Архитектура каталога товаров

Каталог — это лицо любого интернет-магазина. Применяя метод Chunking, мы разобьем задачу на три этапа: получение данных из БД (Модель), обработка логики (Контроллер) и рендеринг HTML (Представление). Для начала вспомним структуру нашей базы данных. В архивных упражнениях мы создавали таблицу 'products' с полями 'id', 'category_id', 'name', 'description' и 'price'. Модель Product связана с моделью Category отношением belongsTo. Чтобы вывести каталог, нам нужно получить все записи из таблицы products. Однако, если в магазине 10 000 товаров, загрузка всех записей разом приведет к исчерпанию оперативной памяти сервера (Out of Memory) и долгой загрузке страницы. Решение — постраничная навигация (Pagination). Laravel предоставляет встроенный метод paginate(), который автоматически формирует SQL-запросы с LIMIT и OFFSET, а также генерирует ссылки для переключения страниц в HTML.

Фильтрация по категориям и Query Builder

Следующий важный функционал — фильтрация. Пользователь должен иметь возможность кликнуть на категорию (например, 'Ноутбуки') и увидеть только соответствующие товары. Для этого мы передаем параметр в URL, например: /products?category=2. В контроллере мы используем класс Request для получения этого параметра. Используя Eloquent ORM, мы можем динамически строить запрос (Query Builder). Мы начинаем запрос с Product::query(). Затем, если параметр category существует, мы добавляем условие where('category_id', $categoryId). Важно использовать метод when(), предоставляемый Laravel, который позволяет добавлять условия в запрос без сложных конструкций if-else. Это делает код элегантным и легко читаемым. Также мы будем использовать жадную загрузку (Eager Loading) с помощью метода with('category'), чтобы избежать проблемы N+1 запросов при выводе названия категории для каждого товара.

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

class ProductController extends Controller {
    public function index(Request $request) {
        $categoryId = $request->input('category');

        $products = Product::query()
            ->with('category') // Жадная загрузка категории (решение проблемы N+1)
            ->when($categoryId, function ($query, $categoryId) {
                return $query->where('category_id', $categoryId);
            })
            ->paginate(12) // Постраничная навигация (12 товаров на страницу)
            ->withQueryString(); // Сохраняем параметры GET в ссылках пагинации

        return view('products.index', compact('products'));
    }
}

Отображение данных в шаблонах Blade

После того как контроллер сформировал коллекцию $products, она передается в представление 'products.index'. Blade — это мощный шаблонизатор Laravel. Мы используем директиву @foreach для обхода коллекции и генерации HTML-карточек товаров. Внутри цикла мы имеем доступ к объекту товара и можем вызывать его свойства: {{ $product->name }}, {{ $product->price }}. Вспомните Упражнение 1.1 из первого блока, где мы создавали метод getFormattedPrice(). Если вы реализовали его в модели Product, вы можете использовать {{ $product->getFormattedPrice() }} для красивого вывода цены со знаком валюты. Для вывода ссылок постраничной навигации достаточно добавить {{ $products->links() }} под сеткой товаров. Laravel автоматически сгенерирует HTML-код, совместимый с фреймворком Tailwind CSS (или Bootstrap, в зависимости от настроек вашего проекта).

Какой метод в Eloquent используется для добавления условия в запрос только в том случае, если первое переданное в него значение истинно (true)?

Задание

Практическое задание: Реализация каталога.

  • Создайте ProductController с помощью команды php artisan make:controller ProductController.
  • Реализуйте метод index, добавив в него логику фильтрации через when() и пагинацию paginate().
  • В файле routes/web.php создайте GET-маршрут '/products', указывающий на этот метод.
  • Создайте файл resources/views/products/index.blade.php.
  • В Blade-файле создайте цикл @foreach ($products as $product) и сверстайте карточку товара.
  • Добавьте под циклом вывод пагинации: {{ $products->links() }}.
10 баллов