Laravel中Trait方法提交表单不执行仅页面刷新问题咨询
问题根因
方法不执行、页面仅刷新的核心原因是表单配置错误,请求根本没有命中你定义的POST路由:
- HTML的
<form>标签默认提交方法为GET,你路由注册的是POST请求方法,方法不匹配时请求会落到同路径的GET编辑页路由,自然不会执行Trait里的逻辑,连你写的调试代码dd($request)都不会触发。 - Laravel默认对POST、PUT、DELETE等写请求开启CSRF校验,原表单没有携带CSRF令牌,就算修正提交方法也会被中间件拦截返回419错误。
修复方案
修正Blade表单配置
给表单显式声明POST提交方法,同时加入CSRF令牌字段,修复后表单代码如下:
<form action="{{ route('permit.HazardsInfo', $permit->id) }}" method="POST"> @csrf @if (Session::has('success')) <div class="alert alert-success w-25 ms-2 text-center"> {{ Session::get('success') }} </div> @endif <input type="text" name="gaurd_names"> <button type="submit" class="btn btn-success btn-label right ms-auto nexttab nexttab" data-nexttab=""> <i class="ri-arrow-left-line label-icon align-middle fs-16 ms-2"></i> Submit </button> </form>
关键改动点:
- 给form标签添加
method="POST"属性,和路由定义的请求方法匹配 - 表单内添加
@csrf指令,自动生成CSRF校验隐藏字段,通过框架的安全校验
可选优化(适配Laravel隐式模型绑定)
你路由参数名定义为{permit},控制器方法中参数名为$id,虽然可以正常运行,但可以调整为参数同名启用隐式模型绑定,省去手动查询模型的代码:
修改Trait中的方法代码:
public function HazardsInfo(Request $request, Permit $permit) { // 移除手动查询代码:$permit = Permit::findOrFail($id); 框架会自动根据路由参数查询对应Permit模型 $permit->update([ 'gaurd_names' => $request->gaurd_names, ]); Log::create([ 'permit_id' => $permit->id, 'created_by' => Auth::user()->id, 'status' => 'og-complete' ]); return Redirect::to("/permit/{$permit->id}/edit")->withSuccess('Hazards Has Been Updated'); }
修改完成后提交表单即可正常触发方法逻辑,调试代码dd($request)也会正常输出请求内容。
内容的提问来源于stack exchange,提问作者Karim Ali
相关产品推荐
相关产品推荐

