thinkphp 6需调用$request->patch()接收patch请求数据,因param()不支持patch方法;须确保content-type正确(如application/json),并避免nginx拦截或重写patch为post。

ThinkPHP 6 如何正确接收 PATCH 请求
ThinkPHP 默认不直接解析 PATCH 请求体(尤其是 application/json),直接用 $this->request->param() 会拿不到数据,不是框架不支持,而是没走对解析路径。
关键在于:TP6 把 PATCH 和 PUT 一样归为「非标准表单方法」,需手动触发参数解析,且必须确保请求头 Content-Type 明确、请求体格式匹配。
- 若前端发的是 JSON,必须设置
Content-Type: application/json,否则$this->request->post()或param()都为空 - TP6 的
param()默认只解析GET+POST表单,PATCH需显式调用$this->request->patch() - 如果用了 Nginx,确认没把
PATCH重写或拦截(某些老旧配置会强制转成POST)
为什么 $this->request->param() 在 PATCH 里返回空数组
因为 param() 内部按请求方法做了分流:GET 读 $_GET,POST 读 $_POST,但 PATCH 不在默认处理列表里,它不会自动解析原始输入流(php://input)。
解决方式是跳过 param(),改用更底层的方法:
-
$this->request->patch()—— 自动识别Content-Type,支持application/json和application/x-www-form-urlencoded -
json_decode($this->request->getRawInput(), true)—— 手动读原始体,适合需要完全控制解析逻辑的场景 - 不要用
$this->request->post(),它对PATCH返回空,和方法名强绑定
TP6 中 PATCH 接收 JSON 数据的完整示例
假设前端发送:
curl -X PATCH http://api.test/user/123 \
-H "Content-Type: application/json" \
-d '{"nickname":"NewName","age":28}'
控制器中应这样写:
public function update($id)
{
// ✅ 正确:自动解析 JSON 或表单
$data = $this->request->patch();
// ❌ 错误:返回空
// $data = $this->request->param();
// 可选:校验是否真有数据
if (empty($data)) {
throw new HttpException(400, 'Invalid PATCH payload');
}
User::where('id', $id)->strict()->update($data);
return json(['code' => 0, 'msg' => 'updated']);
}
部分更新(PATCH)和全量更新(PUT)在 TP6 的实际区别
TP6 本身不强制语义,区别全靠你代码实现。但按 REST 规范和常见实践,要注意三点:
-
PATCH应只更新传入字段,未传字段保留原值;UPDATE语句不能带NULL覆盖(除非业务明确允许) - 别在
PATCH里用User::create($data)或save(),那会忽略主键、可能插入新记录 - 如果前端传了
"status": null,要判断是否真想清空,还是字段缺失——TP6 的patch()会照单全收,得你自己过滤或补默认值
最易被忽略的是:Nginx 或负载均衡器可能静默丢弃 PATCH 方法,建议先用 curl -v 确认服务端收到的确实是 PATCH,而不是被转成了 POST。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











