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

Проектирование административной панели

До этого момента мы работали над клиентской частью (Frontend/User-facing) нашего интернет-магазина. Теперь пришло время создать панель управления (Backend/Admin panel). Это закрытая часть сайта, доступная только сотрудникам магазина. Здесь они смогут управлять каталогом товаров, категориями и заказами. Мы будем использовать паттерн CRUD (Create, Read, Update, Delete) — четыре базовые функции, используемые при работе с базами данных (Chunking).

Первый шаг — разделение прав доступа. Мы не можем позволить любому зарегистрированному пользователю добавлять товары. Нам нужно добавить поле `is_admin` (тип boolean) в таблицу `users`. Затем мы создадим специальный Middleware (Посредник), который будет проверять это поле при каждой попытке зайти в админку.

php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class IsAdmin {
    public function handle(Request $request, Closure $next): Response {
        // Проверяем, авторизован ли пользователь и является ли он администратором
        if (auth()->check() && auth()->user()->is_admin) {
            return $next($request); // Разрешаем прохождение запроса дальше
        }

        // Если нет прав, перенаправляем на главную с сообщением об ошибке
        return redirect('/')->with('error', 'У вас нет доступа к этому разделу.');
    }
}

// В файле routes/web.php группируем маршруты:
/*
Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
    Route::resource('products', AdminProductController::class);
});
*/

Контроллер управления товарами и загрузка файлов

В Laravel есть удобный инструмент — Resource Controllers. Команда `php artisan make:controller AdminProductController --resource` создает контроллер с готовыми методами для всех операций CRUD: `index` (список), `create` (форма добавления), `store` (сохранение), `edit` (форма редактирования), `update` (обновление) и `destroy` (удаление).

Одной из самых сложных задач для новичков является правильная обработка загрузки изображений товаров (Scaffolding). Форма HTML должна обязательно содержать атрибут `enctype="multipart/form-data"`. В контроллере мы используем фасад `Storage` для сохранения файла на диск сервера. Laravel предоставляет абстракцию файловой системы, что позволяет легко менять место хранения файлов: от локального диска до облачного хранилища Amazon S3.

php
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class AdminProductController extends Controller {
    public function store(Request $request) {
        // Валидация входящих данных
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'price' => 'required|numeric|min:0',
            'category_id' => 'required|exists:categories,id',
            'image' => 'nullable|image|mimes:jpg,png,jpeg|max:2048',
            'description' => 'nullable|string'
        ]);

        // Обработка загрузки изображения
        if ($request->hasFile('image')) {
            // Сохраняем файл в папку 'products' на диске 'public'
            $path = $request->file('image')->store('products', 'public');
            $validated['image'] = $path;
        }

        // Массовое заполнение (Mass Assignment) и сохранение в БД
        Product::create($validated);

        return redirect()->route('admin.products.index')
                         ->with('success', 'Товар успешно добавлен!');
    }
}

Валидация и безопасность (Mass Assignment)

В методе `store` мы используем метод `$request->validate()`. Это критически важный шаг для безопасности. Мы строго определяем, какие данные ожидаем получить. Правило `image|mimes:jpg,png|max:2048` гарантирует, что пользователь загрузит именно картинку определенного формата и размером не более 2 Мегабайт.

Обратите внимание на вызов `Product::create($validated)`. Это называется Mass Assignment (Массовое назначение). Чтобы это сработало, в модели `Product` необходимо обязательно определить свойство `$fillable` — массив полей, которые разрешено заполнять таким образом. Если забыть добавить поле (например, `price`) в `$fillable`, Laravel проигнорирует его при сохранении, и в базе данных окажется пустое значение, что приведет к ошибке SQL. Это частая ошибка начинающих разработчиков.

Задание

Реализация функционала удаления товара

  • В AdminProductController найдите метод destroy(Product $product).
  • Напишите проверку: если у товара есть изображение ($product->image), удалите его с диска с помощью Storage::disk('public')->delete($product->image).
  • Вызовите метод $product->delete() для удаления записи из базы данных.
  • Верните redirect()->route('admin.products.index') с сообщением 'Товар удален'.
  • В Blade-шаблоне создайте HTML-форму с методом POST и директивами @csrf и @method('DELETE') для кнопки удаления.
10 баллов