You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&nbsp;{{ _lang('Update') }}</button>
        </div>
    </div>
</div>

问题原因

  1. 请求方法不匹配:表单中添加了_method隐藏字段,值为PATCH,Laravel会自动将POST请求伪装成PATCH请求,但路由定义的是POST方法,导致请求与路由规则不匹配,触发报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:17:16