input('sort', 'city_id'); $sortType = (string) $request->input('sort_type', 'asc'); $page = (int) $request->get('page', 1); // ソート許可(安全 + 規約) $sortable = ['city_id', 'city_name', 'print_layout', 'city_remarks', 'created_at', 'updated_at']; if (!in_array($sort, $sortable, true)) { $sort = 'city_id'; } $sortType = strtolower($sortType); if (!in_array($sortType, ['asc', 'desc'], true)) { $sortType = 'asc'; } $list = $service->paginateList( $request->input('city_name'), $sort, $sortType ); if ($list->total() > 0 && $page > $list->lastPage()) { return redirect()->route('cities.index', [ 'sort' => $sort, 'sort_type' => $sortType, ]); } return view('admin.cities.index', [ 'sort' => $sort, 'sort_type' => $sortType, 'list' => $list, 'page' => $page, ]); } public function create(): View { return view('admin.cities.create', [ 'record' => new City(), ]); } public function store(CityRequest $request, CityService $service): RedirectResponse { $service->create($request->validated()); return redirect() ->route('cities.index') ->with('success', __('登録に成功しました')); } public function edit(int $id): View { $city = City::findOrFail($id); return view('admin.cities.edit', [ 'record' => $city, ]); } public function update(CityRequest $request, int $id, CityService $service): RedirectResponse { $city = City::findOrFail($id); $service->update($city, $request->validated()); return redirect() ->route('cities.index') ->with('success', __('更新に成功しました')); } public function destroy(Request $request): RedirectResponse { $ids = $request->input('pk'); // pk が単体でも配列でも受けられるようにする(編集画面/一覧画面両対応) if ($ids === null || $ids === '' || $ids === []) { return redirect() ->route('cities.index') ->with('error', __('削除する市区を選択してください。')); } $ids = is_array($ids) ? $ids : [$ids]; $deleted = City::destroy($ids); return $deleted ? redirect()->route('cities.index')->with('success', __('削除が完了しました。')) : redirect()->route('cities.index')->with('error', __('削除に失敗しました。')); } }