Laravel中根据当前路由名切换表单请求伪造方法求助
解决Laravel Blade表单根据路由切换请求方法的问题
你的问题核心出在把Blade专属指令@method放进了原生PHP代码块@php里——Blade的编译指令无法在原生PHP代码块中被解析,所以请求伪造的逻辑完全没有生效。下面给你两种简单可行的修复方案:
方案一:使用Blade条件指令(最直观易读)
直接用Blade自带的@if/@else判断路由名称,让@method指令能被正常编译执行:
<form action="{{ Route::currentRouteName() == 'users.create' ? route('users.store') : route('users.update', $user) }}" method="POST"> @csrf @if(Route::currentRouteName() == 'users.create') @method('POST') @else @method('PUT') @endif email: <input type="email" name="email"> <button type="submit">Submit</button> </form>
方案二:直接输出隐藏字段(更简洁)
其实@method('XXX')本质就是生成一个name="_method"的隐藏输入框,你可以用三元表达式直接输出这个字段,减少代码层级:
<form action="{{ Route::currentRouteName() == 'users.create' ? route('users.store') : route('users.update', $user) }}" method="POST"> @csrf <input type="hidden" name="_method" value="{{ Route::currentRouteName() == 'users.create' ? 'POST' : 'PUT' }}"> email: <input type="email" name="email"> <button type="submit">Submit</button> </form>
额外优化建议
你还可以避开硬编码路由名,通过上下文变量判断(比如编辑页面必然存在$user对象),让代码更灵活:
<form action="{{ isset($user) ? route('users.update', $user) : route('users.store') }}" method="POST"> @csrf @isset($user) @method('PUT') @endisset email: <input type="email" name="email" value="{{ old('email', $user->email ?? '') }}"> <button type="submit">Submit</button> </form>
这样哪怕后续路由名称调整,只要新增页面没有$user、编辑页面有$user,表单就能自动适配请求方法和提交地址,维护性更强。
内容的提问来源于stack exchange,提问作者Mehran Nasr
相关产品推荐
相关产品推荐

