request()->isPut() 判断的是语义PUT(含_method伪装),非原始HTTP方法;原始PUT须用$request->server('REQUEST_METHOD') === 'PUT'确认,二者语义不同,需按业务场景区分使用。

request()->isPut() 是最常用、语义最清晰的判断方式,但它返回的是「经过 _method 伪造后的语义 PUT」,不是原始 TCP 层的 PUT 请求。
用 isPut() 判断的是语义 PUT,不是原始方法
ThinkPHP 默认允许通过 POST 表单 + _method=PUT 伪装 PUT 请求。此时 request()->isPut() 会返回 true,但真实 $_SERVER['REQUEST_METHOD'] 仍是 'POST'。
- 适用于业务逻辑层:比如控制器里只关心「这个请求该走更新逻辑」,不care底层怎么发的
- 不适用于审计/统计/限流:这些场景必须区分「真 PUT」和「伪 PUT」
- 若禁用了 method override(
'var_method' => false),isPut()只对原生 PUT 请求生效
用 $request->server('REQUEST_METHOD') 获取原始方法
这是唯一能确认客户端真实发出什么 HTTP 方法的途径,绕过所有中间件和 _method 干扰。
- 直接比较:
$request->server('REQUEST_METHOD') === 'PUT' - 注意大小写:值恒为大写,不用
strtoupper() - 在中间件中使用最安全,比如做全局请求日志时应优先选它
- 旧版 TP6(6.0.0–6.0.3)中
$request->method(true)有 bug,可能仍被_method影响,所以别依赖它
需要同时识别「真 PUT」和「伪 PUT」的场景
比如接口平台要记录「原生 PUT 调用量」,又想把 _method=PUT 的 POST 单独归类为「表单模拟 PUT」。
立即学习“PHP免费学习笔记(深入)”;
- 真 PUT:
$request->server('REQUEST_METHOD') === 'PUT' - 伪 PUT:
$request->server('REQUEST_METHOD') === 'POST' && $request->post('_method') === 'PUT' - 注意:如果项目改了
var_method配置(比如设成'_m'),就要同步改成$request->post('_m') - 不要用
$_POST['_method']直接读,因为框架可能已过滤或转换过该值
真正难处理的不是怎么写判断,而是你得先想清楚——这里要的到底是「客户端发了什么」,还是「框架把它当成了什么」。两者在 ThinkPHP 里默认就不等价。



















