CodeIgniter 4删除文件后如何停留在file_display页面而非返回表单页
问题描述
在CodeIgniter 4项目中,我通过check方法处理Job No表单验证,验证通过后直接返回file_display视图展示对应Job的文件列表。但点击列表中的remove按钮执行remove方法删除文件后,用redirect()->back()或current_url()会跳回需要重新输入Job No的表单页,我需要实现删除后停留在file_display页面。
相关代码如下:
check方法代码
public function check() { $data = [ 'pageTitle' => 'Documents Check', 'action' => 'check', 'validation' => NULL, ]; if($this->request->getMethod() == 'post'){ $validation = $this->validate([ 'jobNo' => [ 'rules' => 'required|numeric|exact_length[6]|is_not_unique[docs.Job_no]', 'errors' => [ 'required' => 'Job No. required.', 'exact_length' => 'Job No. should be exactly 6 digits.', 'numeric' => 'Job No. should be numbers only.', 'is_not_unique' => 'No files available for entered Job No.', ] ], ]); if($validation){ $jobNo = $this->request->getVar('jobNo',FILTER_SANITIZE_STRING); $data['docs'] = $this->docsModel->getDocsByJob($jobNo); return view('documents/files_display',$data); } else{ $data['validation'] = $this->validator; } } return view('documents/files_view',$data); }
file_display视图结构
| id | Job No | Document | action |
|---|---|---|---|
| 1 | 23233 | invoice.pdf | remove |
| 2 | 23233 | deliver.pdf | remove |
remove方法代码
public function remove($id){ if($this->docsModel->delete($id);){ // 注意这里多了个多余的分号 return redirect()->back()->with('success','file removed from the Job record'); } }
问题根因
当前check方法验证通过后是直接返回视图,不是重定向,导致浏览器地址栏仍停留在check的URL。删除文件后用redirect()->back(),浏览器会回到表单提交前的页面(也就是输入Job No的表单页),而非文件展示页面。
解决方案
1. 新增独立的文件展示方法
在控制器里加一个专门的file_display方法,负责接收Job No并渲染文件列表:
public function file_display($jobNo) { // 可选:二次验证Job No合法性,防止非法访问 if (!preg_match('/^\d{6}$/', $jobNo) || !$this->docsModel->jobExists($jobNo)) { return redirect()->to('check')->with('error', '无效的Job编号'); } $data = [ 'pageTitle' => '文件列表', 'docs' => $this->docsModel->getDocsByJob($jobNo), 'jobNo' => $jobNo // 把Job No传到视图,后续可用 ]; return view('documents/files_display', $data); }
需要在docsModel里新增验证Job是否存在的方法:
public function jobExists($jobNo) { return $this->where('Job_no', $jobNo)->countAllResults() > 0; }
2. 修改check方法,验证通过后重定向到file_display
把原check方法里验证通过后的逻辑改成重定向:
if($validation){ $jobNo = $this->request->getVar('jobNo',FILTER_SANITIZE_STRING); // 重定向到专门的文件展示页面,带Job No参数 return redirect()->to("file_display/{$jobNo}"); }
3. 修改remove方法,删除后重定向回对应Job的文件展示页
删除文件前先获取该文件对应的Job No,再重定向到对应页面:
public function remove($id){ // 先获取当前文件的Job No $doc = $this->docsModel->find($id); if (!$doc) { return redirect()->back()->with('error', '文件不存在'); } // 修正原代码多余的分号 if($this->docsModel->delete($id)){ // 重定向到该Job的文件展示页面 return redirect()->to("file_display/{$doc['Job_no']}")->with('success','文件已从Job记录中移除'); } else { return redirect()->back()->with('error','删除文件失败'); } }
4. 调整file_display视图的remove按钮
确保按钮链接正确传递文件ID:
<td><a href="<?= site_url('controller/remove/' . $doc['id']) ?>" onclick="return confirm('确定要删除该文件吗?')">remove</a></td>
做完这些修改后,删除文件就会直接回到对应Job的文件展示页面,不会跳回表单页了。
内容的提问来源于stack exchange,提问作者Krishna Panthi
相关产品推荐
相关产品推荐

