Разработка панели администратора
Создание закрытой зоны для управления товарами, категориями и просмотра списка заказов. Работа с Middleware и загрузкой файлов.
Архитектура панели администратора
Интернет-магазин не может существовать без возможности управлять контентом. Нам нужна закрытая зона (Admin Panel), доступ к которой имеют только пользователи с особыми правами. Здесь мы применим методику Scaffolding: начнем с ограничения доступа, затем создадим маршруты, и в конце реализуем логику загрузки изображений товаров.
Простой аутентификации (проверки, что пользователь вошел в систему) недостаточно. Нам нужна авторизация — проверка прав доступа. Для этого мы добавим поле is_admin (boolean) в таблицу users.
// 1. Создаем Middleware:
// php artisan make:middleware IsAdmin
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class IsAdmin {
public function handle(Request $request, Closure $next) {
// Проверяем, авторизован ли пользователь И является ли он админом
if (auth()->check() && auth()->user()->is_admin) {
return $next($request);
}
// Если нет - выдаем ошибку 403 (Доступ запрещен)
abort(403, 'У вас нет прав для доступа к этой странице.');
}
}
Группировка маршрутов
Вместо того чтобы применять наш новый middleware IsAdmin к каждому маршруту по отдельности, Laravel позволяет группировать их. Это делает файл web.php чистым и легко читаемым.
Внутри группы мы реализуем CRUD (Create, Read, Update, Delete) маршруты для управления товарами (Products) и категориями (Categories).
// routes/web.php
// Группа маршрутов для администратора
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
// Dashboard (Главная панель)
Route::get('/', [AdminController::class, 'dashboard'])->name('dashboard');
// Управление товарами
Route::resource('products', AdminProductController::class);
// Управление заказами
Route::get('/orders', [AdminOrderController::class, 'index'])->name('orders.index');
});
Загрузка изображений товаров
Одной из главных задач администратора является добавление фотографий к товарам. В Laravel для работы с файлами используется фасад Storage. Файлы обычно сохраняются на локальный диск в директорию storage/app/public. Однако эта директория недоступна из браузера напрямую в целях безопасности.
Чтобы сделать изображения видимыми на сайте, необходимо создать символическую ссылку из папки public/storage на storage/app/public. Это делается специальной Artisan командой.
Какую artisan-команду необходимо выполнить в терминале, чтобы создать символическую ссылку и сделать загруженные изображения публично доступными?
// Пример сохранения изображения в AdminProductController
public function store(Request $request) {
$request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric',
'image' => 'required|image|mimes:jpeg,png,jpg|max:2048',
]);
// Сохраняем файл в папку 'products' на диске 'public'
$imagePath = $request->file('image')->store('products', 'public');
Product::create([
'name' => $request->name,
'price' => $request->price,
'image_path' => $imagePath, // В БД сохраняем только путь: products/имяфайла.jpg
]);
return redirect()->route('admin.products.index')->with('success', 'Товар добавлен');
}
| Действие | Метод HTTP | Маршрут | Метод Контроллера |
|---|---|---|---|
| Показать список товаров | GET | /admin/products | index() |
| Форма создания товара | GET | /admin/products/create | create() |
| Сохранить новый товар | POST | /admin/products | store() |
| Форма редактирования | GET | /admin/products/{id}/edit | edit() |
| Обновить товар в БД | PUT/PATCH | /admin/products/{id} | update() |
| Удалить товар | DELETE | /admin/products/{id} | destroy() |