middleware('auth'); を使用していた } /** * 区画別利用率状況ページの表示 * Laravel 12変更点:Request処理の最適化、エラーハンドリングの強化 * * @param \Illuminate\Http\Request $request * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse */ public function index(Request $request, UsingStatusService $service) { try { // CSRF トークンの自動検証(Laravel 12標準機能) // リクエストパラメータの取得 // Laravel 12変更点:$request->input()の使用を推奨 $parkId = $request->input('park_id', null); $isSearchRequest = $request->has('search') || $request->isMethod('post'); // ログ出力(デバッグ用) Log::info('区画別利用率状況ページアクセス', [ 'park_id' => $parkId, 'is_search' => $isSearchRequest, 'method' => $request->method() ]); // 駐輪場一覧の取得(選択用ドロップダウン) $parkList = $service->getParkList(); // 利用率統計データの取得 // Laravel 12変更点:デフォルトで全データを表示(ユーザー選択不要) $utilizationStats = $service->getUtilizationStats($parkId); // データが空の場合の処理 if ($utilizationStats->isEmpty() && $parkId) { // 指定された駐輪場のデータが見つからない場合 return redirect()->route('using_status') ->with('warning', '選択された駐輪場のデータが見つかりませんでした。'); } // 検索要求でない場合は全データを表示 if (!$isSearchRequest && !$parkId) { $utilizationStats = $service->getUtilizationStats(null); } // 合計値の計算 $totals = $service->calculateTotals($utilizationStats); // 選択された駐輪場の情報 $selectedPark = null; if ($parkId && $parkList->isNotEmpty()) { $selectedPark = $parkList->firstWhere('park_id', $parkId); } // ビューに渡すデータの準備 $viewData = [ 'parkList' => $parkList, // 駐輪場選択用リスト 'utilizationStats' => $utilizationStats, // 利用率統計データ 'totals' => $totals, // 合計値 'selectedParkId' => $parkId, // 選択された駐輪場ID 'selectedPark' => $selectedPark, // 選択された駐輪場情報 'isSearchRequest' => $isSearchRequest, // 検索リクエストかどうか 'hasData' => $utilizationStats->isNotEmpty() // データが存在するかどうか ]; // 成功メッセージの設定(検索時) if ($isSearchRequest && $utilizationStats->isNotEmpty()) { session()->flash('success', '利用率データを正常に取得しました。'); } return view('admin.using_status.index', $viewData); } catch (\Exception $e) { // エラーログの出力 Log::error('区画別利用率状況ページエラー', [ 'error' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'park_id' => $parkId ?? null ]); // エラー発生時のリダイレクト return redirect()->route('using_status') ->with('error', 'データの取得中にエラーが発生しました。管理者にお問い合わせください。'); } } /** * 駐輪場一覧の取得 * Laravel 12変更点:プライベートメソッドでの処理分離 * * @return \Illuminate\Support\Collection */ // 旧: Helper 直呼びはサービス化により撤去 /** * 利用率統計データの取得 * Laravel 12変更点:エラーハンドリングの強化 * * @param int|null $parkId 駐輪場ID * @return \Illuminate\Support\Collection */ // 旧: Helper 直呼びはサービス化により撤去 /** * 合計値の計算 * Laravel 12変更点:計算ロジックの分離 * * @param \Illuminate\Support\Collection $stats 統計データ * @return array */ // 旧: Helper 直呼びはサービス化により撤去 /** * Ajax用API(将来拡張用) * Laravel 12対応:JSON APIレスポンス * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function apiGetUtilization(Request $request, UsingStatusService $service) { try { $parkId = $request->input('park_id'); // データ取得 $stats = $service->getUtilizationStats($parkId); $totals = $service->calculateTotals($stats); return response()->json([ 'success' => true, 'data' => $stats, 'totals' => $totals, 'message' => 'データを正常に取得しました。' ]); } catch (\Exception $e) { Log::error('API利用率取得エラー', [ 'error' => $e->getMessage() ]); return response()->json([ 'success' => false, 'message' => 'データの取得に失敗しました。', 'error' => app()->isProduction() ? null : $e->getMessage() ], 500); } } /** * データエクスポート(将来拡張用) * Laravel 12対応:CSVエクスポート機能 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function exportCsv(Request $request, UsingStatusService $service, \App\Services\CsvService $csv) { try { $parkId = $request->input('park_id'); $stats = $service->getUtilizationStats($parkId); $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => 'attachment; filename="利用率状況_' . date('Y-m-d_H-i-s') . '.csv"' ]; // サービスでCSV文字列を構築 $rows = []; // ヘッダー $rows[] = ['駐輪場', '車種', '限界収容台数', '現在収容台数', '空き', '利用率']; foreach ($stats as $stat) { $rows[] = [ (string) $stat->park_name, (string) $stat->ptype_subject, (string) $stat->park_limit, (string) $stat->current_count, (string) $stat->available, sprintf('%.1f%%', (float) $stat->usage_rate), ]; } $csvData = $csv->buildCsvString($rows, ','); return response($csvData, 200, $headers); } catch (\Exception $e) { Log::error('CSVエクスポートエラー', [ 'error' => $e->getMessage() ]); return redirect()->route('using_status') ->with('error', 'CSVエクスポートに失敗しました。'); } } /** * CSVデータの生成(プライベートメソッド) * Laravel 12変更点:文字エンコーディングの考慮 * * @param \Illuminate\Support\Collection $stats * @return string */ // CSV 生成は CsvService に委譲(本メソッドは撤去) }