ServiceAdminController.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. /*
  4. * ServiceAdminController — CRUD услуг в административной панели.
  5. * Маршруты: admin.services.*
  6. * Slug генерируется автоматически из title при создании,
  7. * при редактировании не меняется (стабильные URL на детальных страницах).
  8. */
  9. use App\Http\Controllers\Controller;
  10. use App\Models\Service;
  11. use Illuminate\Http\RedirectResponse;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Cache;
  14. use Illuminate\View\View;
  15. class ServiceAdminController extends Controller
  16. {
  17. public function index(): View
  18. {
  19. $services = Service::orderBy('sort_order')->orderBy('title')->get();
  20. return view('admin.services.index', compact('services'));
  21. }
  22. public function create(): View
  23. {
  24. return view('admin.services.form', ['service' => new Service]);
  25. }
  26. public function store(Request $request): RedirectResponse
  27. {
  28. $data = $this->validated($request);
  29. $data['slug'] = Service::generateSlug($data['title']);
  30. Service::create($data);
  31. $this->forgetCache();
  32. return redirect()->route('admin.services.index')
  33. ->with('success', 'Услуга «' . $data['title'] . '» создана.');
  34. }
  35. public function edit(Service $service): View
  36. {
  37. return view('admin.services.form', compact('service'));
  38. }
  39. public function update(Request $request, Service $service): RedirectResponse
  40. {
  41. $data = $this->validated($request, $service->id);
  42. $service->update($data);
  43. $this->forgetCache();
  44. return redirect()->route('admin.services.index')
  45. ->with('success', 'Услуга «' . $service->title . '» обновлена.');
  46. }
  47. public function destroy(Service $service): RedirectResponse
  48. {
  49. $title = $service->title;
  50. $service->delete();
  51. $this->forgetCache();
  52. return redirect()->route('admin.services.index')
  53. ->with('success', 'Услуга «' . $title . '» удалена.');
  54. }
  55. // ── Приватные хелперы ─────────────────────────────────────────────────
  56. private function validated(Request $request, ?int $exceptId = null): array
  57. {
  58. $rules = [
  59. 'title' => 'required|string|max:255',
  60. 'icon' => 'nullable|string|max:10',
  61. 'excerpt' => 'nullable|string|max:500',
  62. 'description' => 'nullable|string',
  63. 'tags' => 'nullable|array',
  64. 'tags.*' => 'integer',
  65. 'sort_order' => 'nullable|integer|min:0',
  66. 'is_active' => 'nullable|boolean',
  67. ];
  68. $raw = $request->validate($rules);
  69. // tags — plain array integer ID из справочника dict_values
  70. $raw['tags'] = array_values(array_map('intval', array_filter($raw['tags'] ?? [])));
  71. $raw['sort_order'] = (int) ($raw['sort_order'] ?? 0);
  72. $raw['is_active'] = $request->boolean('is_active');
  73. return $raw;
  74. }
  75. private function forgetCache(): void
  76. {
  77. // Сбрасываем кеш секций страниц, где используются блоки services_grid
  78. foreach (['home', 'services', 'contacts'] as $slug) {
  79. Cache::forget('page_sections.' . $slug);
  80. }
  81. }
  82. }