Laravel路由GET方法不支持,收银机状态修改及跳转异常排查
收银机状态修改报错问题排查与解决
问题现象
尝试关闭收银机(CashRegister)状态时,触发错误:The GET method is not supported for this route. Supported methods: POST,但表单明明使用了POST方法;将路由改为GET后能执行修改,但无法跳转到cashregister.index视图。
相关代码
控制器方法
public function showclose(Request $request, $id) { $cashregister = CashRegister::find($id); if (!$request->ajax()) { return view('backend.cashregister.close', compact('cashregister', 'id')); } else { return view('backend.cashregister.modal.close', compact('cashregister', 'id')); } } public function close(Request $request, $id) { $cashregister = CashRegister::find($id); $cashregister->status = 0; $cashregister->closedate = date('Y-m-d H:i:s'); $cashregister->save(); if (!$request->ajax()) { return redirect()->route('cashregister.index')->with('success', _lang('Closed Box')); } else { return response()->json(['result' => 'success', 'action' => 'update', 'message' => _lang('Closed Box'), 'data' => $cashregister, 'table' => '#cashregister_table']); } }
路由定义
Route::resource('cashregister','CashRegisterController'); Route::get('cashregister/showclose/{id}', 'CashRegisterController@showclose')->name('cashregister.showclose'); Route::post('cashregister/close/{id}', 'CashRegisterController@close')->name('cashregister.close');
表单代码
<form method="post" class="ajax-screen-submit" autocomplete="off" action="{{ action('CashRegisterController@close', $id) }}" enctype="multipart/form-data"> {{ csrf_field()}} <input name="_method" type="hidden" value="PATCH"> <div class="row px-2"> <table class="table table-bordered"> <tr><td>{{ _lang('Box Quantity') }}</td><td>{{ $cashregister->startingamount }}</td></tr> <tr><td>{{ _lang('Open Date') }}</td><td>{{ $cashregister->created_at }}</td></tr> <tr><td>{{ _lang('Final Amount') }}</td><td>{{ $cashregister->finalamount }}</td></tr> <tr><td>{{ _lang('Close Date') }}</td><td>{{ $cashregister->closedate }}</td></tr> <tr><td>{{ _lang('Status') }}</td><td class='status'>{!! xss_clean(user_status($cashregister->status)) !!}</td></tr> </table> <div class="form-group"> <div class="col-md-12"> <button type="submit" class="btn btn-danger "><i class="ti-lock"></i> {{ _lang('Update') }}</button> </div> </div> </div>
问题原因
- 请求方法不匹配:表单中添加了
_method隐藏字段,值为PATCH,Laravel会自动将POST请求伪装成PATCH请求,但路由定义的是POST方法,导致请求与路由规则不匹配,触发报错。 - GET路由不支持重定向逻辑:改为GET路由后,虽然能执行更新操作,但GET请求场景下,控制器中的
redirect()->route()不符合HTTP规范,Laravel无法正确处理重定向响应,导致跳转失败。
解决方案
方案一:调整路由为PATCH方法(推荐,符合RESTful规范)
修改路由定义,将POST改为PATCH,匹配表单的伪装请求:
Route::patch('cashregister/close/{id}', 'CashRegisterController@close')->name('cashregister.close');
表单中的_method字段保留不变,请求会正确匹配路由,非AJAX请求的重定向逻辑也能正常生效。
方案二:移除表单的_method隐藏字段
如果不需要遵循RESTful规范,直接使用纯POST请求,删除表单中的伪装字段:
<!-- 删除这一行 --> <input name="_method" type="hidden" value="PATCH">
此时表单会以原生POST请求发送,与现有POST路由匹配,操作完成后可正常跳转到目标视图。
额外优化:使用路由名称生成表单action
推荐用路由名称替代直接指定控制器方法,避免路由规则变动导致的错误:
<form method="post" class="ajax-screen-submit" autocomplete="off" action="{{ route('cashregister.close', $id) }}" enctype="multipart/form-data">
内容的提问来源于stack exchange,提问作者causeofhell
相关产品推荐
相关产品推荐

