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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:22:49