/
hikqri
/
up
Обзор
Документация
Войти
/
hikqri
/
up
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/Http/Controllers/Admin/ProductController.php
112 строк
3 KB
Myckaa
first_commit
26 июн 2026, 18:36
26 июн 2026, 18:36
8095503
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Category; use App\Models\Product; use App\Services\ProductImageService; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; class ProductController extends Controller { public function __construct(private ProductImageService $images) { } public function index() { $products = Product::with('category')->latest()->paginate(20); return view('admin.products.index', compact('products')); } public function create() { $categories = Category::orderBy('name')->get(); return view('admin.products.create', compact('categories')); } public function store(Request $request) { $data = $this->validated($request); $data['slug'] = $this->uniqueSlug($data['name']); Product::create($data); return redirect()->route('admin.products.index')->with('success', 'Товар создан'); } public function edit(Product $product) { $categories = Category::orderBy('name')->get(); return view('admin.products.edit', compact('product', 'categories')); } public function update(Request $request, Product $product) { $data = $this->validated($request, $product); $product->update($data); return redirect()->route('admin.products.index')->with('success', 'Товар обновлён'); } public function destroy(Product $product) { $this->deleteImage($product); $product->delete(); return redirect()->route('admin.products.index')->with('success', 'Товар удалён'); } protected function validated(Request $request, ?Product $product = null): array { $data = $request->validate([ 'category_id' => ['required', 'exists:categories,id'], 'name' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'price' => ['required', 'numeric', 'min:0'], 'rating' => ['nullable', 'numeric', 'min:0', 'max:5'], 'reviews_count' => ['nullable', 'integer', 'min:0'], 'is_featured' => ['nullable', 'in:0,1'], 'is_recommended' => ['nullable', 'in:0,1'], 'image' => ['nullable', 'image', 'mimes:jpeg,png,jpg,webp,gif', 'max:5120'], ]); $data['is_featured'] = $request->boolean('is_featured'); $data['is_recommended'] = $request->boolean('is_recommended'); $data['rating'] = $request->input('rating', 4.9); $data['reviews_count'] = (int) $request->input('reviews_count', 0); if ($request->hasFile('image')) { if ($product?->image) { $this->deleteImage($product); } $data['image'] = $this->images->store($request->file('image')); } return $data; } protected function deleteImage(Product $product): void { if ($product->image) { Storage::disk('public')->delete($product->image); } } protected function uniqueSlug(string $name): string { $slug = Str::slug($name); $original = $slug; $i = 1; while (Product::where('slug', $slug)->exists()) { $slug = $original . '-' . $i++; } return $slug; } }