input('sort', 'setting_id'); $sort_type = $request->input('sort_type', 'asc'); // 許可されたカラムのみソート(安全対策) $allowedSorts = ['setting_id', 'setting_key', 'setting_value']; // ← 必要に応じて増やす if (!in_array($sort, $allowedSorts)) { $sort = 'setting_id'; } if (!in_array($sort_type, ['asc', 'desc'])) { $sort_type = 'desc'; } $list = Setting::orderBy($sort, $sort_type)->paginate($perPage); return view('admin.settings.list', [ 'list' => $list, 'sort' => $sort, 'sort_type' => $sort_type, ]); } /** * 新規追加(GET/POST): /settings/add */ public function add(Request $request) { if ($request->isMethod('post')) { $v = Validator::make($request->all(), $this->rules()); if ($v->fails()) { return back()->withErrors($v)->withInput(); } // チェックボックス(未送信時は false) $data = $this->onlyFillable($request); $data['printable_alert_flag'] = $request->boolean('printable_alert_flag'); DB::transaction(function () use ($data) { Setting::create($data); }); return redirect()->route('settings')->with('success', '設定を登録しました。'); } // GET時:空フォーム表示 return view('admin.settings.add', [ 'setting' => new Setting(), // フォーム初期化用 'isEdit' => false, ]); } /** * 編集(GET/POST): /settings/edit/{id} */ public function edit(Request $request, int $id) { $setting = Setting::findOrFail($id); if ($request->isMethod('post')) { $v = Validator::make($request->all(), $this->rules($id)); if ($v->fails()) { return back()->withErrors($v)->withInput(); } $data = $this->onlyFillable($request); $data['printable_alert_flag'] = $request->boolean('printable_alert_flag'); DB::transaction(function () use ($setting, $data) { $setting->update($data); }); return redirect()->route('settings')->with('success', '設定を更新しました。'); } // GET時:編集フォーム表示 return view('admin.settings.edit', [ 'setting' => $setting, 'isEdit' => true, ]); } /** * 詳細表示: /settings/info/{id} */ public function info(int $id) { $setting = Setting::findOrFail($id); return view('admin.settings.info', [ 'setting' => $setting, 'isInfo' => true, 'isEdit' => false, ]); } /** * 削除(一覧/編集 共通対応): /settings/delete または /settings/delete/{id} */ public function delete(Request $request, $id = null) { // 一覧画面(checkbox で複数削除) $ids = $request->input('ids'); // 編集画面(単体削除) if ($id) { $ids = [$id]; } // 削除対象が空 if (empty($ids)) { return redirect()->route('settings')->with('error', '削除対象が選択されていません。'); } // 削除処理 Setting::destroy($ids); return redirect()->route('settings')->with('success', '設定を削除しました。'); } // ===== バリデーション・ユーティリティ ===== /** * バリデーションルール */ private function rules(?int $id = null): array { return [ 'edit_master' => ['nullable','string','max:255'], 'web_master' => ['nullable','string','max:255'], 'auto_change_date' => ['nullable','date'], 'auto_chage_master' => ['nullable','string','max:255'], // ※カラム名は仕様通り 're-issue_alert_number' => ['nullable','integer','min:0'], 'image_base_url1' => ['nullable','string','max:255'], 'image_base_url2' => ['nullable','string','max:255'], 'printable_alert_flag' => ['nullable','boolean'], 'printable_number' => ['nullable','integer','min:0'], 'printable_alert_number' => ['nullable','integer','min:0'], 'printer_keep_alive' => ['nullable','integer','min:0'], 'operator_id' => ['nullable','integer','min:0'], ]; } /** * フォームから fillable のみ抽出 */ private function onlyFillable(Request $request): array { return $request->only([ 'edit_master', 'web_master', 'auto_change_date', 'auto_chage_master', 're-issue_alert_number', 'image_base_url1', 'image_base_url2', 'printable_number', 'printable_alert_number', 'printer_keep_alive', 'operator_id', 'printable_alert_flag', ]); } }