ThinkPHP 6.x 不支持 --api 参数,需手动创建控制器、配置路由、禁用视图、解析请求体并显式返回 JSON;资源路由须手动注册且方法名严格匹配,参数绑定和状态码也需手动处理。

ThinkPHP 6.x 没有内置的 --api 参数,所谓“一键生成 RESTful 控制器”是不存在的;你必须手动建目录、改类名、写方法、配路由、显式返回 JSON,漏掉任何一环,接口就直接 404 或返回空内容。
php think make:controller 不支持 --api 参数
运行 php think make:controller User --api 会报错 Unknown option --api——这不是你命令输错了,是 TP6 的命令行工具压根没实现这个选项。官方 make:controller 只负责建文件和空类壳,不生成方法体,也不处理视图禁用或 JSON 返回逻辑。
- 唯一可行路径是
php think make:controller api/User,它会生成app/controller/api/User.php - 生成后必须手动修改类名(如
UserController extends BaseController),否则路由无法解析 - 必须在控制器里显式禁用视图:
$this->view = null;或继承think\Controller(而非BaseController) - 别指望它自动写出
index()、save()等方法——你拿到的是个空文件
Route::resource() 必须显式注册且命名严格
资源路由不会自动生效,必须在 app/route/app.php(不是 api.php)里手动写,且不能被中间件分组包裹,否则路由映射失败。
- 正确写法:
Route::resource('user', 'api.User');—— 注意是api.User,不是api/User - 方法名必须严格为
index、read、save、update、delete;写成show()或destroy()就完全不匹配 - TP6 不支持
only/except精简动作,如果只要纯 API 行为(去掉create和edit),就得拆开手动注册:Route::get('user', 'api.User@index')、Route::post('user', 'api.User@save')等 - 带版本前缀时,用
Route::prefix('api/v1')->group(...),别写Route::resource('api/v1/user', ...),后者会导致v1段被忽略
PUT/DELETE 请求拿不到参数?因为没读 php://input
TP5/TP6 的 save()、update()、delete() 方法**不会自动调用 input() 或 param()**。前端发 JSON 或表单数据,后端默认收不到,除非你手动解析原始输入。
立即学习“PHP免费学习笔记(深入)”;
- Content-Type 是
application/json:用$this->request->param()或json_decode(file_get_contents('php://input'), true) - Content-Type 是
application/x-www-form-urlencoded:用$this->request->post(),但注意 TP6 默认 trim 首尾空格,字段允许空格时得加过滤回调 - 浏览器或某些 SDK 发不出原生 PUT/DELETE,需前端在 POST 请求头加
X-HTTP-Method-Override: PUT,TP6 路由层原生识别该 header 并重写请求方法 - URL 中的
:id参数只绑定到方法第一个位置参数,且变量名必须是$id;写成public function read($uid)就收不到值
每个方法结尾都得手动 return json()
即使路由、方法名、参数都对了,不显式调用 json(),响应可能是空内容、HTML 模板甚至 500 错误。TP6 不会自动把返回值转成 JSON。
- 标准写法:
return json(['code' => 0, 'data' => $data]); - 创建成功建议用
return json(['code' => 0], 201);显式返回 201 状态码 - 别用
Response::create(..., 'json'),TP6 推荐直接用json()辅助函数,更简洁且兼容性好 - 如果用了中间件统一封装 JSON 响应,要确认它没覆盖掉控制器里的
return,否则可能二次 encode 导致双层 JSON
最常被忽略的一点:多应用模式下,api 必须已在 app/multi.php 中注册为合法应用名,否则 Route::resource('user', 'api.User') 解析时直接 404,连控制器都不会加载。



















