thinkphp 8.1 的 restful 资源接口通过 route::resource() 一句声明+控制器严格遵循7个固定方法名(index/create/save/read/edit/update/delete)实现自动绑定,路径、动词、方法名须严丝合缝,参数需手动获取,响应须返回 json 并设置正确状态码。

ThinkPHP 8.1 的 RESTful 资源接口不是靠手动写一堆 get/post/put/delete 规则堆出来的,而是用 Route::resource() 一句声明 + 控制器严格遵循命名约定,就能自动绑定标准动作。关键不在“怎么写”,而在“怎么对得上”——路径、动词、方法名三者必须严丝合缝。
资源路由注册要规范
在 app/route/api.php(或你配置的 API 路由文件)中注册:
- 用
Route::resource('users', 'api.User')声明资源,其中api.User是控制器完整类名(命名空间+类名) - 若需版本前缀,必须用分组包裹:
Route::prefix('api/v1')->group(function () { Route::resource('users', 'api.User'); });,不能直接写Route::resource('api/v1/users', 'api.User') - 避免和显式路由冲突:确保没有其他规则提前匹配了
/users或/users/:id这类路径
控制器方法名必须精准对应
控制器必须继承 think\Controller(不是 think\BaseController),且仅实现以下 7 个固定方法名(大小写、拼写一个都不能错):
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
index()→ GET /users(列表) -
create()→ GET /users/create(纯 API 场景建议禁用或重定向) -
save()→ POST /users(创建,不是 store()) -
read($id)→ GET /users/:id(详情,不是 show()) -
edit($id)→ GET /users/:id/edit(纯 API 场景建议禁用) -
update($id)→ PUT/PATCH /users/:id(更新) -
delete($id)→ DELETE /users/:id(删除)
少一个、错一个,框架就无法识别对应动作,请求会落到错误方法甚至 404。
参数与数据获取要手动处理
资源路由不会自动帮你取参或解析请求体:
-
save()方法里,表单提交用$this->request->post(),JSON 提交必须设Content-Type: application/json并用$this->request->param()(不是input('post.')) -
read($id)、update($id)、delete($id)中的$id是自动注入的,但其他查询参数(如?with=posts)仍需手动调$this->request->param('with') - 注意全局配置影响:若开启
url_convert,路径中user_info会被转成user-info,但资源路由只认下划线命名,别混用
响应与状态码要符合语义
纯 API 接口应统一返回 JSON,并正确设置 HTTP 状态码:
- 成功创建资源返回
json($data, 201) - 资源不存在返回
json(['error' => 'Not Found'], 404) - 参数校验失败返回
json(['error' => 'Validation failed'], 400) - 不要依赖模板渲染,所有方法末尾都应有明确的
return语句
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










