如何正确使用POST路由 解决Laravel提交后URL异常重复提交问题
问题原因
你遇到的是典型的表单重复提交问题:POST请求处理完成后直接返回视图,浏览器地址栏会停留在POST路由/create-object的地址,此时刷新页面会重新提交上次的POST请求,导致重复创建Object数据。
解决方法
用标准的PRG(Post/Redirect/Get)模式处理即可,步骤如下:
- 首先确保你的
web.php中已经定义了列表页对应的GET路由(如果之前已经写过可以跳过这步),示例:
// 列表页GET路由,对应你要返回的地址localhost/object-list Route::get('/object-list', [ObjectController::class, 'listObject'])->name('object.list');
注意路由路径要和你实际使用的一致,你问题里最后提到的localhost/list-object如果是笔写错写成和之前object-list不一样的,按你实际的路径调整即可
- 修改
createObject方法的返回逻辑,不要直接返回视图,改为重定向到上面定义的列表页路由:
// 原有Object创建逻辑保留 // 把原来的 return view('view-object'); 替换为下面的代码 return redirect()->route('object.list');
如果需要返回创建成功的提示,可以用闪存数据传递:
return redirect()->route('object.list')->with('message', 'Object创建成功');
在列表页视图中可以读取闪存数据展示提示,示例Blade代码:
@if(session('message')) <p class="success-tip">{{ session('message') }}</p> @endif
原理解释
PRG模式是表单提交的通用规范:用户提交POST请求后,服务端返回302重定向响应,浏览器会自动发起GET请求加载重定向的目标地址,此时地址栏就会更新为列表页的地址,后续刷新页面只会重新GET加载列表页,不会再触发之前的POST提交动作,也就不会出现重复创建数据的问题。
内容的提问来源于stack exchange,提问作者Balaure
相关产品推荐
相关产品推荐

