Laravel表单POST提交路由重复且数据未存储问题求助
兄弟,我一眼就瞅出问题所在了——你表单里的action用了相对路径,这就是路由重复、404的元凶!
当你从类似entradas/1/ventaEntrada/200000/montoTotal/create的页面提交表单时,相对路径会在当前页面的URL基础上拼接,结果就变成了entradas/1/ventaEntrada/200000/montoTotal/entradas/1/ventaEntrada/200000/montoTotal,自然找不到对应的路由,返回404。
给你几个解决方案,按优先级来:
1. 用Laravel路由辅助函数生成可靠的action路径
这是最推荐的方式,完全避免路径拼接错误。首先你可以通过php artisan route:list命令确认你的resource路由中store方法的命名,应该是entradas.{id_entrada}.ventaEntrada.{precio_entrada}.montoTotal.store。
然后把表单的action改成这样:
<form action="{{ route('entradas.{id_entrada}.ventaEntrada.{precio_entrada}.montoTotal.store', ['id_entrada' => $id_entrada, 'precio_entrada' => $precio_entrada]) }}" method="POST"> @csrf <input type="number" name="monto_total" placeholder="Monto total" class="form-control mb-2" required> <button class="btn btn-primary btn-block" type="submit">ADD</button> <!-- 这里你之前的clas拼写错了,改成class --> <a href="/entradas/1/ventaEntrada/1/montoTotal" class="btn btn-primary btn-sm">BACK</a> </form>
2. 改用绝对路径
如果暂时不想用路由辅助函数,只要在action的路径开头加个/,变成绝对路径就行:
<form action="/entradas/{{$id_entrada}}/ventaEntrada/{{$precio_entrada}}/montoTotal" method="POST">
这样表单提交时就会从网站根目录开始拼接路径,不会重复叠加当前页面的URL。
可选优化:调整路由结构更符合Laravel规范
你现在的resource路由嵌套了太多参数,其实precio_entrada完全可以放到表单的隐藏字段里,不用写在路由里。这样路由可以简化:
Route::resource('/entradas/{id_entrada}/ventaEntrada', 'Venta_entradaController');
然后在create方法里把precio_entrada传到视图,表单里加个隐藏字段:
<input type="hidden" name="precio_entrada" value="{{ $precio_entrada }}">
最后在store方法里通过$request->precio_entrada获取这个值就行,这样路由结构更清晰,也减少了出错的可能。
按上面的方法改完,再提交表单应该就能正常存储数据,不会出现404了!
内容的提问来源于stack exchange,提问作者Rinzler21

