Laravel 9更新操作时出现404页面未找到错误求助
问题描述
我已尝试匹配路由与表单action,自认为配置正确,但提交表单时仍持续出现404页面未找到错误,可能遗漏了某些配置但无法定位。项目工期紧张,急需解决。提交表单后跳转地址异常,相关代码如下:
index.blade.php 代码
<tbody> @foreach($payments as $payment) <tr> <td>{{ $payment->order->first_last_name }}</td> <td>{{ $payment->order->business_name }}</td> <td>{{ $payment->order->business_type }}</td> <td>{{ $payment->order->phone_number }}</td> <td>{{ $payment->order->postal_code }}</td> <td>{{ $payment->order->email }}</td> <td>{{ $payment->order->address }}</td> <button type="button" class="btn btn-success btn-sm" data-action="{{ route('payments.send', $payment->id) }}" data-bs-toggle="modal" data-bs-target="#send" data-id="{{ $payment->id }}">Send</button> </td> <td> @php $status = $payment->status @endphp <span class="{{ $status['bs_class'] }}"> {{ $status['label'] }} </span> </td> <td>{{ $payment->accounting_code }}</td> </tr> @include('Admin.layouts.modal') @endforeach </tbody>
JS 代码
<script> $('#send').on('show.bs.modal', function (event) { var button = $(event.relatedTarget); var action = button.data('action'); var orderId = button.data('id'); var modal = $(this); modal.find('form').attr('action', action); document.getElementById("orderId").value = orderId; }); </script>
modal.blade.php 代码
<div class="modal fade" id="send" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="send" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <form action="{{ route('payments.accounting', $payment->id) }}" method="post"> @csrf @method('PUT') <input type="hidden" id="orderId" value=""> <div class="modal-header"> <h5 class="modal-title" id="sendTitle">send</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="close"></button> </div> <div class="modal-body"> <div class="mb-3"> <label for="accounting_code" class="form-label">کد accounting_code</label> <input type="text" class="form-control" id="accounting_code" name="accounting_code"> </div> </div> <div class="modal-footer"> <button type="submit" class="btn btn-success">save</button> </div> </form> </div> </div> </div>
web.php 路由代码
Route::put('/payments/accounting/{payment}', [App\Http\Controllers\Admin\PaymentController::class,'accounting'])->name('payments.accounting');
PaymentController.php 代码
public function accounting(Payment $payment, Request $request) { dd('hello'); $data = [ 'accounting_code' => $request->post('accounting_code') ]; $payment->update($data); return back(); }
问题排查与解决方案
- 路由名称不匹配:按钮的
data-action调用了route('payments.send', $payment->id),但路由中仅定义了payments.accounting,不存在payments.send路由,导致JS设置的表单action为无效地址,触发404。需将按钮中的route('payments.send', $payment->id)改为route('payments.accounting', $payment->id)。 - 重复渲染Modal:在
@foreach循环内@include('Admin.layouts.modal')会为每个payment生成相同id的模态框,DOM中id重复会导致JS事件绑定混乱、表单action设置异常。需将@include('Admin.layouts.modal')移至循环外部,仅渲染一次模态框。 - Modal初始Action错误:若将Modal移至循环外,原modal中
{{ route('payments.accounting', $payment->id) }}会因无$payment变量报错,需将form的action初始值设为空,完全依赖JS设置正确地址。
修改后的关键代码片段
index.blade.php(部分)
<tbody> @foreach($payments as $payment) <tr> <!-- 其他td内容不变 --> <td> <button type="button" class="btn btn-success btn-sm" data-action="{{ route('payments.accounting', $payment->id) }}" data-bs-toggle="modal" data-bs-target="#send" data-id="{{ $payment->id }}">Send</button> </td> <!-- 其他td内容不变 --> </tr> @endforeach </tbody> <!-- 将Modal移至循环外 --> @include('Admin.layouts.modal')
modal.blade.php(form部分)
<form action="" method="post"> @csrf @method('PUT') <!-- 其他内容不变 --> </form>
内容的提问来源于stack exchange,提问作者Mahmoud Khosravi
相关产品推荐
相关产品推荐

