ThinkPHP开发RESTful API需手动补全关键步骤:TP6不支持--api参数,须用php think make:controller api/User创建控制器并确认继承think\Controller;路由需在app/route/app.php中显式注册Route::resource('user', 'api.User');方法名必须为index/read/save/update/delete且返回json();TP8需开启rest_action_as_method配置。

ThinkPHP 开发 RESTful API 不是点个命令就完事,关键步骤必须手动补全,否则路由不通、方法不触发、返回空白甚至 500 错误。不同版本差异明显:TP6 没有 --api 参数,TP8 才真正支持;写法、配置、返回方式都得按版本对号入座。
控制器创建:别信 --api,路径命名才靠谱
TP6 的 php think make:controller 命令压根不识别 --api 或 --resource,运行就会报 Unknown option --api。这不是你配错了,是框架没实现。
- 正确做法是用命名空间路径生成:
php think make:controller api/User,它会在app/controller/api/User.php创建文件 - 类名默认是
UserController,需确认继承think\Controller(不是 facade 类),该基类已禁用视图,无需再设$this->view = null - TP8 起才支持
--api参数:php think make:controller api/UserController --api,生成的类自动带好index/read/save等标准方法骨架
资源路由注册:位置、写法、命名一个都不能错
控制器建好了,路由不会自动绑定。必须在 app/route/app.php(不是 api.php)里显式写:
-
Route::resource('user', 'api.User');—— 注意第二个参数用点号.连接,不是斜杠/或反斜杠 - 若用了多应用模式,先确认
api已在app/multi.php中注册,否则直接 404 - TP8 必须开启配置:
config/route.php中设'rest_action_as_method' => true,否则 PUT/DELETE 请求无法匹配到update/delete方法 - 需要接口版本控制?用分组前缀:
Route::prefix('v1')->group(function () { Route::resource('users', 'api.User'); });
方法与响应:名字要准、返回要明、状态码要对
资源路由只认固定方法名,拼错一个字就不触发;返回 JSON 也不是默认行为,必须每处都写清楚。
立即学习“PHP免费学习笔记(深入)”;
- 方法名必须严格为:
index(列表)、read(查单个)、save(新增)、update(全量更新)、delete(删除);show、store、list都无效 - 每个方法结尾都要显式返回:
return json(['code' => 0, 'data' => $data]);;创建成功建议用return json(['code' => 0], 201);返回 201 状态码 - 别用
Response::create(..., 'json'),TP6/TP8 都推荐直接用json()辅助函数,简洁且兼容性好
前端请求适配:浏览器发不出 PUT/DELETE?加头就行
浏览器表单和多数前端 SDK 默认只支持 GET/POST,直接发 PUT/DELETE 会 405 Method Not Allowed。不用改后端代码,靠请求头就能解决。
- 前端在 POST 请求中加上请求头:
X-HTTP-Method-Override: PUT(或DELETE) - TP6 和 TP8 路由层原生识别该 header,并自动重写请求方法,无需额外中间件或逻辑
- 调试时可用 Postman 直接选 PUT/DELETE 方法测试,绕过此限制



















