orderBy('title')->get(); return view('admin.services.index', compact('services')); } public function create(): View { return view('admin.services.form', ['service' => new Service]); } public function store(Request $request): RedirectResponse { $data = $this->validated($request); $data['slug'] = Service::generateSlug($data['title']); Service::create($data); $this->forgetCache(); return redirect()->route('admin.services.index') ->with('success', 'Услуга «' . $data['title'] . '» создана.'); } public function edit(Service $service): View { return view('admin.services.form', compact('service')); } public function update(Request $request, Service $service): RedirectResponse { $data = $this->validated($request, $service->id); $service->update($data); $this->forgetCache(); return redirect()->route('admin.services.index') ->with('success', 'Услуга «' . $service->title . '» обновлена.'); } public function destroy(Service $service): RedirectResponse { $title = $service->title; $service->delete(); $this->forgetCache(); return redirect()->route('admin.services.index') ->with('success', 'Услуга «' . $title . '» удалена.'); } // ── Приватные хелперы ───────────────────────────────────────────────── private function validated(Request $request, ?int $exceptId = null): array { $rules = [ 'title' => 'required|string|max:255', 'icon' => 'nullable|string|max:10', 'excerpt' => 'nullable|string|max:500', 'description' => 'nullable|string', 'tags' => 'nullable|array', 'tags.*' => 'integer', 'sort_order' => 'nullable|integer|min:0', 'is_active' => 'nullable|boolean', ]; $raw = $request->validate($rules); // tags — plain array integer ID из справочника dict_values $raw['tags'] = array_values(array_map('intval', array_filter($raw['tags'] ?? []))); $raw['sort_order'] = (int) ($raw['sort_order'] ?? 0); $raw['is_active'] = $request->boolean('is_active'); return $raw; } private function forgetCache(): void { // Сбрасываем кеш секций страниц, где используются блоки services_grid foreach (['home', 'services', 'contacts'] as $slug) { Cache::forget('page_sections.' . $slug); } } }