Category::query()->latest('id')->paginate(20), ]); } public function create() { return view('admin.categories.create'); } public function store(Request $request) { $data = $this->validateCategory($request); $data['slug'] = $this->makeUniqueSlug($data['slug'] ?: $data['name']); Category::create($data); return redirect()->route('admin.categories.index')->with('status', 'Категория создана.'); } public function edit(Category $category) { return view('admin.categories.edit', [ 'category' => $category, ]); } public function update(Request $request, Category $category) { $data = $this->validateCategory($request, $category); $data['slug'] = $this->makeUniqueSlug($data['slug'] ?: $data['name'], $category->id); $category->update($data); return redirect()->route('admin.categories.index')->with('status', 'Категория обновлена.'); } public function destroy(Category $category) { $category->delete(); return redirect()->route('admin.categories.index')->with('status', 'Категория удалена.'); } private function validateCategory(Request $request, ?Category $category = null): array { return $request->validate([ 'name' => ['required', 'string', 'max:255'], 'slug' => [ 'nullable', 'string', 'max:255', Rule::unique('categories', 'slug')->ignore($category?->id), ], 'description' => ['nullable', 'string'], 'is_active' => ['nullable', 'boolean'], ]) + ['is_active' => $request->boolean('is_active')]; } private function makeUniqueSlug(string $value, ?int $ignoreId = null): string { $base = Str::slug($value); if ($base === '') { $base = 'category'; } $slug = $base; $index = 2; while ( Category::query() ->where('slug', $slug) ->when($ignoreId, fn ($query) => $query->whereKeyNot($ignoreId)) ->exists() ) { $slug = "{$base}-{$index}"; $index++; } return $slug; } }