Laravel中如何通过两个按钮实现保存并跳转至不同页面?
问题排查与解决方案
我来帮你梳理下问题根源,同时给出优化后的修复方案:你的代码出现空白页且数据未保存,主要是缺少默认分支处理导致无响应返回,另外重复代码也容易隐藏错误,还有需要确保Session中的关联ID有效。
1. 核心问题修复:添加Switch默认分支
当submitbutton参数未正常传递或值不匹配时,控制器没有返回任何响应,直接导致空白页。必须给switch添加default分支处理这种异常情况:
switch($request->submitbutton) { // ... 原有case逻辑 default: return redirect()->back()->with('error', '无效的提交操作,请重试'); }
2. 优化代码:抽离重复的保存逻辑
两个case里的保存代码完全重复,不仅冗余,还容易在修改时漏改。把通用逻辑抽出来,让代码更简洁易维护:
public function store(StoreExamQuestionsRequest $request) { if (! Gate::allows('exam_question_create')) { return abort(401); } // 先检查Session中的考试ID是否存在,避免关联失败 $examId = session()->get('id'); if(!$examId) { return redirect()->back()->with('error', '未找到关联的考试信息,请重新进入'); } try { // 通用保存逻辑:处理文件+创建问题 $request = $this->saveFiles($request); $question = ExamQuestion::create([ 'question' => $request->question, 'exam_id' => $examId, 'score' => $request->score, 'question_image' => $request->question_image ]); // 批量保存选项 for ($q = 1; $q <= 4; $q++) { $optionText = $request->input('text_' . $q, ''); if (!empty($optionText)) { ExamOption::create([ 'exam_question_id' => $question->id, 'text' => $optionText, 'is_correct' => $request->input('is_correct_' .$q, false) // 给默认值避免null ]); } } // 根据按钮类型跳转 switch($request->submitbutton) { case 'save': return redirect()->route('admin.exam_questions.create')->with('success', '问题添加成功,继续添加'); case 'save-done': return redirect()->route('admin.exam_questions.index')->with('success', '所有问题添加完成'); default: return redirect()->back()->with('error', '无效的提交操作,请重试'); } } catch (\Exception $e) { // 捕获异常,方便调试排查问题 return redirect()->back()->with('error', '保存失败:'.$e->getMessage()); } }
3. 额外检查项
- 确认
StoreExamQuestionsRequest已验证所有必填字段(比如question、score),Laravel会自动在验证失败时重定向回表单并携带错误提示。 - 检查
saveFiles方法是否正确处理了文件上传,确保返回的是有效的请求实例。 - 你的表单按钮代码是正确的,但要确认表单的
action指向了当前控制器的store路由,且请求方法为POST(Laravel Collective的Form组件默认会处理这一点)。
内容的提问来源于stack exchange,提问作者Simona Buga
相关产品推荐
相关产品推荐

