ReviewAdminController.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. /*
  4. * ReviewAdminController — CRUD отзывов клиентов.
  5. *
  6. * Создан: 2026-05-07
  7. * Маршруты: resource /admin/reviews (index, create, store, edit, update, destroy)
  8. * POST /admin/reviews/{review}/toggle — переключение is_active
  9. * Защита: middleware 'admin' (EnsureUserIsAdmin)
  10. *
  11. * После изменения отзывов сбрасывается кеш страниц, где они используются.
  12. */
  13. use App\Http\Controllers\Controller;
  14. use App\Models\Review;
  15. use Illuminate\Http\RedirectResponse;
  16. use Illuminate\Http\Request;
  17. use Illuminate\Support\Facades\Cache;
  18. use Illuminate\View\View;
  19. class ReviewAdminController extends Controller
  20. {
  21. // Список всех отзывов, упорядочен по sort_order, затем по дате создания
  22. public function index(): View
  23. {
  24. $reviews = Review::orderBy('sort_order')->orderByDesc('created_at')->get();
  25. return view('admin.reviews.index', compact('reviews'));
  26. }
  27. // Форма создания нового отзыва
  28. public function create(): View
  29. {
  30. return view('admin.reviews.form', ['review' => new Review]);
  31. }
  32. // Сохранение нового отзыва
  33. public function store(Request $request): RedirectResponse
  34. {
  35. $data = $this->validated($request);
  36. Review::create($data);
  37. $this->flushCache();
  38. return redirect()->route('admin.reviews.index')->with('success', 'Отзыв добавлен.');
  39. }
  40. // Форма редактирования отзыва
  41. public function edit(Review $review): View
  42. {
  43. return view('admin.reviews.form', compact('review'));
  44. }
  45. // Обновление отзыва
  46. public function update(Request $request, Review $review): RedirectResponse
  47. {
  48. $review->update($this->validated($request));
  49. $this->flushCache();
  50. return redirect()->route('admin.reviews.index')->with('success', 'Отзыв обновлён.');
  51. }
  52. // Удаление отзыва
  53. public function destroy(Review $review): RedirectResponse
  54. {
  55. $review->delete();
  56. $this->flushCache();
  57. return redirect()->route('admin.reviews.index')->with('success', 'Отзыв удалён.');
  58. }
  59. // Переключение видимости (активен / скрыт) без перехода на форму
  60. public function toggle(Review $review): RedirectResponse
  61. {
  62. $review->update(['is_active' => ! $review->is_active]);
  63. $this->flushCache();
  64. return back()->with('success', $review->is_active ? 'Отзыв активирован.' : 'Отзыв скрыт.');
  65. }
  66. // ── Приватные вспомогательные ────────────────────────────────────────
  67. // Валидация и подготовка данных из запроса
  68. private function validated(Request $request): array
  69. {
  70. $request->validate([
  71. 'author' => 'required|string|max:128',
  72. 'car_name' => 'nullable|string|max:128',
  73. 'rating' => 'required|integer|min:1|max:5',
  74. 'body' => 'required|string|max:2000',
  75. 'review_date' => 'nullable|date',
  76. 'is_active' => 'nullable|boolean',
  77. 'sort_order' => 'nullable|integer|min:0',
  78. ]);
  79. return [
  80. 'author' => $request->input('author'),
  81. 'car_name' => $request->input('car_name') ?: null,
  82. 'rating' => (int) $request->input('rating', 5),
  83. 'body' => $request->input('body'),
  84. 'review_date' => $request->input('review_date') ?: null,
  85. 'is_active' => $request->boolean('is_active'),
  86. 'sort_order' => (int) $request->input('sort_order', 0),
  87. ];
  88. }
  89. // Сбрасываем кеш страниц при изменении отзывов
  90. private function flushCache(): void
  91. {
  92. foreach (['home', 'services', 'contacts', 'privacy', 'offer'] as $slug) {
  93. Cache::forget('page_sections.'.$slug);
  94. Cache::forget('page.'.$slug);
  95. }
  96. }
  97. }