thinkphp实现前后端分离需弃用session与模板渲染,专注api服务:统一api路由前缀、jwt+redis认证、验证码解耦存储、跨域通过中间件集中配置。

ThinkPHP 做前后端分离,本质是把后端退回到纯 API 角色:不渲染页面、不依赖 Session、不走模板引擎。MVC 架构本身没问题,但传统用法(如 Controller 渲染 View)得停用;跨域不是加几行 header 就完事,尤其在微服务场景下,必须统一、可配置、可灰度。
路由层彻底剥离前端入口
前端 Vue/React 独立部署(如 Nginx 静态服务),后端 ThinkPHP 只暴露接口。不要让 TP 处理任何 HTML 路由:
- 删掉或注释掉默认的
route.php中类似'/' => 'index/index/index'的页面路由 - 所有接口统一前缀,例如
api/v1/,用 RESTful 方式定义:Route::group('api/v1', function () { Route::post('login', 'Auth/login'); Route::get('users', 'User/index'); }); - Vue history 模式下,Nginx 需 fallback 到
index.html,但这和 TP 无关——TP 不参与前端路由分发
跨域配置必须走中间件+扩展,禁用硬编码
微服务环境下,跨域规则需集中管理、支持多环境、避免污染业务逻辑:
- 安装官方跨域扩展:
composer require topthink/think-cors - 配置
config/cors.php,按环境区分域名:
开发环境:允许 localhost:8080、localhost:3000
生产环境:只写上线域名,禁止*,且allow_credentials为 true 时 origin 必须具体 - 在
app/middleware.php中全局注册:[\think\middleware\Cors::class],而非在每个控制器里手动 header
认证与状态管理放弃 Session,改用 JWT + Redis
微服务天然无状态,Session 依赖 Cookie 和服务端存储,无法横向扩展,也跨不了域:
- 登录成功后生成 JWT token,通过
Authorization: Bearer xxx传给前端,后端用中间件校验 - 用户权限、登录态等敏感信息不存 Session,改存 Redis,key 命名为
user:token:{jwt-jti},设置 TTL - 退出登录即 DEL 对应 key,无需销毁 Session ID,也不依赖 PHP session_start()
验证码等临时凭证必须解耦 Session
传统 $this->session->set('captcha', $code) 在跨域+微服务下完全失效:
- 生成验证码接口返回
{ "captcha_id": "abc123", "image": "data:image/png;base64,..." } - 前端提交表单时,把
captcha_id和用户输入一并 POST 到校验接口 - 后端从 Redis 读
captcha:abc123(BCRYPT 加密存储),比对后立即 DEL,防止重放 - 缓存驱动必须用 Redis,不能用 file 或 apcu,确保多实例间共享
不复杂但容易忽略:跨域、认证、验证码三者看似独立,实则共用一个底层前提——放弃有状态会话。TP 的 MVC 结构照常可用,Model 处理数据、Controller 处理请求、View 彻底弃用,这才是微服务语境下的真·前后端分离。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











