Laravel表单双提交按钮如何对接资源控制器的store与index方法
Laravel 双提交按钮路由绑定实现方案
无需引入复杂的JS逻辑或额外路由,基于HTML原生表单提交特性结合Laravel控制器逻辑即可完成匹配,以下是两种可直接落地的实现方式,可根据实际场景选择。
方案1:控制器参数判断(全场景兼容推荐)
这个方案兼容性最强,不会出现请求方法不匹配的问题,适合所有场景,仅需小幅度调整即可实现。
- 优化视图按钮的命名规则(可选)
把两个提交按钮的name属性统一为同一个字段,避免出现冗余参数。基于HTML原生提交规则,同name的提交按钮只会把当前点击的按钮值随请求发送:
如果不想修改原有按钮的name和value(即保留原来<button type="submit" value="save" name="action" class="btn btn-primary">SAVE</button> <button type="submit" value="list" name="action" class="btn btn-primary">SHOW</button>name="subbutton"和name="list"的写法),也可以直接在控制器里判断请求是否携带对应按钮参数,同样可以实现识别,只是参数会更零散。 - 在
store方法开头增加跳转判断
两个按钮的请求都会先进入store路由,根据前端传过来的按钮标识判断是否要跳转列表页:public function store(Request $request) { // 识别到点击SHOW按钮,直接调用index方法返回列表页 if ($request->input('action') === 'list') { return $this->index(); // 保留原有按钮命名的情况下,判断逻辑可写为 if ($request->has('list')) } // 以下保留原有正常保存逻辑 $validated = $request->validate([ // 原有验证规则 ]); // 原有数据存库操作 return redirect()->route('data.index')->with('success', '数据保存成功'); }说明:这种方式不需要额外修改路由配置,完全复用已有的
store和index方法逻辑,不会出现方法不匹配、CSRF验证失败等问题。
方案2:原生属性实现轻量跳转(无后端逻辑改动)
如果不想在store方法里加判断逻辑,可以借助HTML原生属性实现,适合不需要携带表单已填内容、直接跳转列表页的场景。
注意:
formaction不会修改表单的请求方法,请求方法由<form>标签上的method属性决定。如果当前表单是POST类型,直接把formaction指向默认GET请求的index路由,会触发405方法不允许的报错。
修正方式为给SHOW按钮增加一行简单的点击事件,点击时临时切换表单的请求方法为GET、修改提交地址为index路由,提交完成后自动还原表单属性,不影响SAVE按钮的原有逻辑:
<button type="submit" value="list" name="list" class="btn btn-primary" onclick="event.preventDefault(); const form = this.closest('form'); form.method = 'GET'; form.action = '{{ route('data.index') }}'; form.submit();" > SHOW </button>
内容的提问来源于stack exchange,提问作者iiii
相关产品推荐
相关产品推荐

