要在ThinkPHP 6.0中正确构建RESTful风格的DELETE与PUT请求,必须配置HiddenMethodFilter中间件、定义匹配路由、编写签名一致的控制器方法,并采用POST+_method模拟或原生AJAX/fetch提交。

要在 ThinkPHP 6.0 中正确构建 RESTful 风格的 DELETE 与 PUT 请求,必须绕过浏览器原生仅支持 GET/POST 的限制,同时确保路由、控制器方法、表单提交和参数传递四者严格对齐,否则请求会被拦截或误判为非法。
配置隐藏方法过滤器
ThinkPHP 6.0 默认不启用 HiddenMethodFilter,需手动注册中间件以支持 _method 参数解析。
打开 app/middleware.php,在全局中间件数组中追加:
【必须放在 hinkmiddlewareValidatePostSize::class 之后、 hinkmiddlewareParseToken::class 之前】
'think\middleware\HiddenMethodFilter' => hinkmiddlewareHiddenMethodFilter::class,
这一步不可跳过,否则 POST 携带 _method=delete 将被直接忽略,不会触发 DELETE 路由匹配。
定义 RESTful 路由
在 route/app.php 中声明资源路由或显式路由,二者选其一即可。
方法一:使用资源路由(推荐)
Route::resource('user', 'controller/User');
该语句自动生成 DELETE /user/:id → User::delete() 和 PUT /user/:id → User::update() 等标准映射。
方法二:手动定义(更可控)
Route::put('user/:id', 'controller/User/update')->bind('user');<br>Route::delete('user/:id', 'controller/User/delete')->bind('user');
【id 必须作为 URL 参数而非 query string 传入,否则无法匹配绑定规则】
编写控制器方法
控制器方法签名必须与路由定义严格一致,且需启用资源注入。
第一步:确认控制器继承 hinkController 或 hink
estController
第二步:在 app/controller/User.php 中定义:
public function delete($id) {<br> // $id 已由框架自动解析并注入,无需 request()->param('id')<br> return json(['status' => 'deleted', 'id' => $id]);<br>}
public function update($id) {<br> // PUT 请求体中的数据需用 input('put.') 获取,不能用 input('post.')<br> $data = input('put.');<br> Db::name('user')->where('id', $id)->update($data);<br> return json(['status' => 'updated', 'id' => $id]);<br>}
注意:PUT 请求默认不解析表单数据,必须用 input('put.') 或 request()->put(),否则 $data 为空数组。
前端表单提交方式
浏览器不支持原生 DELETE/PUT 表单提交,必须用 POST + _method 隐藏字段模拟。
方法1:传统 HTML 表单(适用于无 JS 场景)
方法2:AJAX 提交(推荐,可避免页面跳转)
$.ajax({<br> url: '/user/123',<br> type: 'DELETE',<br> dataType: 'json',<br> success: function(res) { console.log(res); }<br>});
方法3:使用 fetch API(现代浏览器)
fetch('/user/123', { method: 'DELETE' })<br> .then(r => r.json())<br> .then(console.log);
若用 AJAX/fetch 直接发 DELETE/PUT,无需配置 HiddenMethodFilter,也不需要 _method 字段——该中间件只处理 POST 模拟场景。











