/
ghx
/
TicketFlow
Обзор
Документация
Войти
/
ghx
/
TicketFlow
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
app/Http/Controllers/CartController.php
141 строка
4 KB
osnov
.
26 июн 2026, 11:56
26 июн 2026, 11:56
dc2de34
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use App\Models\Session; use Illuminate\Http\Request; class CartController extends Controller { public function index(Request $request) { $cart = $this->getCart($request); $items = $this->resolveCartItems($cart); return view('cart.index', [ 'items' => $items, 'total' => collect($items)->sum('price'), ]); } public function add(Request $request) { $validated = $request->validate([ 'session_id' => 'required|exists:showtimes,id', 'seat_ids' => 'required|array|min:1', 'seat_ids.*' => 'integer|exists:seats,id', ]); $session = Session::with('hall')->findOrFail($validated['session_id']); $occupied = $this->occupiedSeatIds($session->id); $seatIds = array_unique($validated['seat_ids']); foreach ($seatIds as $seatId) { if (in_array($seatId, $occupied, true)) { return response()->json([ 'message' => 'Одно или несколько мест уже заняты.', ], 422); } } $validSeatIds = $session->hall->seats()->whereIn('id', $seatIds)->pluck('id')->all(); if (count($validSeatIds) !== count($seatIds)) { return response()->json([ 'message' => 'Выбранные места не принадлежат этому залу.', ], 422); } $cart = $this->getCart($request); foreach ($seatIds as $seatId) { $key = $session->id . '-' . $seatId; $cart[$key] = [ 'session_id' => $session->id, 'seat_id' => $seatId, 'price' => (float) $session->price, ]; } $request->session()->put('cart', $cart); if ($request->wantsJson()) { return response()->json([ 'message' => 'Билеты добавлены в корзину.', 'count' => count($cart), ]); } return redirect()->route('cart.index')->with('success', 'Билеты добавлены в корзину.'); } public function remove(Request $request, string $key) { $cart = $this->getCart($request); unset($cart[$key]); $request->session()->put('cart', $cart); return redirect()->route('cart.index')->with('success', 'Билет удалён из корзины.'); } public function clear(Request $request) { $request->session()->forget('cart'); return redirect()->route('cart.index')->with('success', 'Корзина очищена.'); } public static function count(Request $request): int { return count($request->session()->get('cart', [])); } private function getCart(Request $request): array { return $request->session()->get('cart', []); } private function resolveCartItems(array $cart): array { if ($cart === []) { return []; } $sessionIds = collect($cart)->pluck('session_id')->unique()->values(); $seatIds = collect($cart)->pluck('seat_id')->unique()->values(); $sessions = Session::with(['movie', 'hall']) ->whereIn('id', $sessionIds) ->get() ->keyBy('id'); $seats = \App\Models\Seat::whereIn('id', $seatIds)->get()->keyBy('id'); $items = []; foreach ($cart as $key => $item) { $session = $sessions->get($item['session_id']); $seat = $seats->get($item['seat_id']); if (! $session || ! $seat) { continue; } $items[] = [ 'key' => $key, 'session' => $session, 'seat' => $seat, 'price' => $item['price'], ]; } return $items; } private function occupiedSeatIds(int $sessionId): array { return \App\Models\Ticket::query() ->where('showtime_id', $sessionId) ->whereIn('status', ['reserved', 'paid']) ->pluck('seat_id') ->all(); } }