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

Создание панели администратора

Разработка защищенной зоны (Admin Panel) для управления каталогом товаров (CRUD) и просмотра поступивших заказов. Настройка Middleware.

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

Интернет-магазин не может существовать без интерфейса для менеджеров и владельцев. Нам нужна Панель администратора (Admin Dashboard). В ней должны быть реализованы CRUD-операции (Create, Read, Update, Delete) для товаров и категорий, а также возможность просматривать заказы пользователей. Главное требование к админ-панели — безопасность. Обычный пользователь или гость сайта не должен иметь доступа к этим страницам. Ранее мы использовали middleware auth для защиты профиля пользователя. Но для админ-панели этого недостаточно: авторизованный клиент — это не администратор. Нам нужно создать собственное Middleware (программного посредника). В Laravel это делается командой php artisan make:middleware IsAdmin. Этот посредник будет перехватывать запрос до того, как он попадет в контроллер, проверять роль пользователя в базе данных (например, колонку is_admin типа boolean), и либо пропускать запрос дальше, либо возвращать ошибку 403 (Forbidden).

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);
        }

        // Если нет - прерываем запрос и выдаем ошибку 403
        abort(403, 'Доступ запрещен. У вас нет прав администратора.');
    }
}

// В routes/web.php мы группируем маршруты админки:
// Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
//     Route::get('/dashboard', [AdminController::class, 'index']);
//     Route::resource('products', ProductAdminController::class);
// });

После защиты маршрутов мы приступаем к созданию CRUD для товаров. Самая сложная часть при добавлении нового товара — это загрузка изображений. Когда администратор заполняет форму создания товара, он прикрепляет файл картинки. В контроллере мы должны принять этот файл через объект Request, сгенерировать для него уникальное имя, сохранить в публичную директорию сервера и записать путь к файлу в базу данных. В Laravel для этого используется фасад Storage. Метод $request->file('image')->store('products', 'public') автоматически поместит загруженный файл в папку storage/app/public/products и вернет путь к нему. Важно помнить: чтобы файлы из папки storage/app/public были доступны из интернета (ведь браузер запрашивает картинки по URL), необходимо создать символическую ссылку (symlink) с помощью команды php artisan storage:link. Эта команда создает ярлык в публичной папке public/storage, который ведет к реальным файлам.

Вторая важная функция админки — управление заказами. Мы создаем страницу, где выводится список всех записей из таблицы orders с пагинацией (например, 20 заказов на страницу). Используя жадную загрузку (Eager Loading) Eloquent Order::with('user')->paginate(20), мы сразу получаем данные о клиенте, оформившем заказ, избегая проблемы N+1 запросов. На странице детального просмотра заказа (Show) мы выводим все связанные товары ($order->items). Здесь же администратор должен иметь возможность изменить статус заказа. Например, после того как заказ собран на складе и передан курьеру, администратор меняет статус с 'paid' на 'shipped' (отправлен). Это реализуется простой формой с выпадающим списком <select>, которая отправляет PUT-запрос на обновление модели заказа.

Задание

Создайте базовую структуру панели администратора.

  • Добавьте колонку boolean 'is_admin' в таблицу users через миграцию.
  • Создайте middleware IsAdmin и зарегистрируйте его в bootstrap/app.php (или Kernel.php для старых версий).
  • В routes/web.php создайте группу маршрутов с префиксом /admin и middleware ['auth', 'admin'].
  • Сгенерируйте Resource Controller для управления товарами (ProductAdminController).
  • Реализуйте метод store() с обработкой загрузки изображения товара.
  • Выполните php artisan storage:link.
10 баллов

Какую команду Artisan нужно выполнить, чтобы загруженные изображения товаров стали доступны для отображения в браузере?

Какая HTTP-ошибка (код состояния) традиционно возвращается, если пользователь авторизован, но у него нет прав доступа к запрошенному ресурсу (например, не админ)?