thinkphp 5.1 多模块 api 项目需按业务域划分 app/api/、app/admin/、app/open/ 等独立模块,通过路由分组隔离、命名空间匹配、禁用视图与 session、统一 json 响应及模块化 cors 与异常处理实现解耦。

在 ThinkPHP 5.1 中搭建多模块 API 项目,核心是明确模块划分、隔离路由、统一响应格式,并避免视图与 Session 干扰。它不是简单复制多个 controller,而是通过目录结构 + 路由分组 + 命名空间协同实现逻辑解耦。
模块结构要清晰:按业务域建独立模块
ThinkPHP 5.1 默认使用 app/ 目录(非旧版的 application/),每个模块应为独立子目录,例如:
-
app/api/:面向 H5、小程序、App 的纯 JSON 接口 -
app/admin/:后台管理接口(含权限校验、日志等) -
app/open/:第三方开放平台接口(OAuth2、Webhook 等)
每个模块下保持标准三层:controller、model、validate(可选)。注意命名空间必须匹配路径,如 app\api\controller\User 对应 app/api/controller/User.php。
路由必须分组隔离:用域名或前缀区分模块
不推荐混用默认路由,否则容易出现 /admin/user 和 /api/user 冲突或 fallback 错误。推荐两种方式:
-
前缀方式(开发常用):在
route/route.php中定义分组Route::group('api', function () { Route::rule('user/:id', 'api/User/read'); });
访问地址即为/api/user/123 -
子域名方式(生产推荐):
Route::domain('api.example.com', function () { Route::get('user/:id', 'api/User/read'); });
需配合 DNS 或 hosts 配置,更利于 Nginx 分流与 CORS 独立控制
控制器统一返回 JSON,禁用模板和 Session
API 模块中所有控制器应继承 think\Controller,但方法内不调用任何 view 渲染或 $this->success() 类模板方法:
- 每条接口末尾写明:
return json(['code' => 200, 'data' => $result]); - 关闭模块级模板自动渲染:在
app/api/config.php中添加'view_replace_str' => [], 'template' => ['type' => 'Think'],
并确保'view_suffix' => 'html'不影响 JSON 输出 - 禁用 Session(前后端分离场景):在
app/api/middleware.php中移除\think\middleware\SessionInit::class,或全局配置'session_on' => false
跨域与异常处理要模块化配置
不同模块可能对接不同前端源,CORS 和异常响应不能全局一刀切:
- 为
api模块单独安装think-cors:composer require topthink/think-cors,然后在app/api/middleware.php加入中间件 - 自定义异常处理:在
app/api/exception.php中重写render()方法,强制返回 JSON 格式错误,例如:return json(['code' => 500, 'msg' => $e->getMessage()], 500); - 数据库连接可按模块配置:在
app/api/config/database.php中指定独立的'database'或读写分离策略
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











