| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- <?php
- namespace App\Http\Controllers\Admin;
- /*
- * ServiceAdminController — CRUD услуг в административной панели.
- * Маршруты: admin.services.*
- * Slug генерируется автоматически из title при создании,
- * при редактировании не меняется (стабильные URL на детальных страницах).
- */
- use App\Http\Controllers\Controller;
- use App\Models\Service;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\View\View;
- class ServiceAdminController extends Controller
- {
- public function index(): View
- {
- $services = Service::orderBy('sort_order')->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);
- }
- }
- }
|