6.0 KiB
6.0 KiB
BuildAdmin ThinkPHP → Webman 迁移执行提示词
将以下内容作为提示词,指导 AI 或开发者执行从 ThinkPHP 8 到 Webman 的迁移工作。
一、项目背景
当前项目为 BuildAdmin,基于 ThinkPHP 8.1.4 开发,包含以下核心特性:
- 多应用:api、admin、common 三个应用
- 路由:使用 pathinfo 自动路由,无显式路由文件
- 依赖:think-orm、think-multi-app、think-throttle、think-migration
- 控制器:约 32 个,继承链为 BaseController → Api → Backend/Frontend
- 中间件:AllowCrossDomain、AdminLog、LoadLangPack
- 扩展:extend/ba 目录、modules 模块化系统
二、迁移目标
将后端从 ThinkPHP 8(PHP-FPM 模式)迁移至 Webman(常驻内存模式),要求:
- 保持现有 API 接口路径和返回格式不变,确保前端无需改动
- 业务逻辑、模型、验证器尽量复用
- 迁移后需通过功能测试验证
三、执行步骤(按顺序执行)
步骤 1:初始化 Webman 项目
- 在项目根目录同级或指定目录创建 webman 项目:
composer create-project workerman/webman dafuweng-webman - 安装 think-orm:
composer require webman/think-orm - 安装 think-validate(如需):
composer require topthink/think-validate - 配置
config/thinkorm.php,从config/database.php迁移数据库配置
步骤 2:迁移配置文件
- 将
config/database.php转为 webman 的config/thinkorm.php格式 - 将
config/buildadmin.php、config/upload.php、config/cache.php等迁移至config/目录 - 配置
.env支持(webman 需安装 vlucas/phpdotenv 或使用 config 读取)
步骤 3:梳理并定义路由
- 扫描
app/api/controller/、app/admin/controller/下所有控制器及方法 - 根据 ThinkPHP pathinfo 规则(应用/控制器/方法)生成 webman 路由
- 在
config/route.php中定义,格式示例:Route::get('/api/index/index', [\app\api\controller\Index::class, 'index']); Route::any('/admin/auth/admin/index', [\app\admin\controller\auth\Admin::class, 'index']); - 保持 URL 路径与现有前端调用一致(如
/api/xxx、/admin/xxx)
步骤 4:改造控制器基类
- 创建
app/support/BaseController.php,适配 webman 的 Request 注入 - 方法签名改为:
public function xxx(Webman\Http\Request $request),第一个参数必须为 Request - 将
$this->error()、$this->success()改为return response()->json(...)或封装为返回 Response 的方法 - 移除对
think\App的依赖,用$request替代$this->request
步骤 5:改造 Api 与 Backend 基类
app/common/controller/Api.php:迁移initialize()中的数据库检查、ip_check、set_timezone、语言包加载逻辑app/common/controller/Backend.php:迁移 Auth 鉴权、权限校验、Event::trigger('backendInit')等逻辑- 将
$this->app->request->controllerPath改为从路由或 Request 中获取
步骤 6:迁移中间件
AllowCrossDomain:改写为 webman 中间件格式,在config/middleware.php中注册AdminLog:同上LoadLangPack:使用 webman 的国际化插件或自行实现- 原控制器中间件逻辑迁移至路由组中间件
步骤 7:替换 Facade 与助手函数
Config::get()→config('xxx.yyy')或config_get('xxx', 'yyy')Db::→ 使用 think-orm 的Db类(webman/think-orm 已适配)Lang::get()→ 使用 webman 的__()或国际化组件Event::trigger()、Event::listen()→ 使用 webman 事件插件或观察者模式request()→ 通过方法参数传入$request或使用request()助手(需在 webman 中实现)
步骤 8:迁移 extend/ba 扩展
- 将
extend/ba/下类中依赖的think\Request、think\facade\*替换为 webman 兼容实现 - 保持
extend/的 PSR 自动加载,在 composer.json 或 webman 中配置
步骤 9:迁移模块系统
app/common/service/moduleService.php中的模块加载逻辑迁移至 webman 的config/bootstrap.php或进程启动回调- 确保 modules 目录下的模块能在 webman 启动时正确加载
步骤 10:迁移公共函数
app/common.php中的get_sys_config、get_auth_token、full_url、ip_check、set_timezone等- 将
request()调用改为接收$request参数或实现 webman 的 request 助手 - 将
config()调用改为 webman 的 config 函数
步骤 11:入口与部署
- 入口:Webman 使用
php start.php start启动,默认端口 8787,无需public/index.php - 静态资源:将原
public/下的install/、robots.txt等复制到dafuweng-webman/public/ - Nginx:root 指向
public目录,try_files $uri @proxy代理动态请求到 8787 - 详细说明见 webman部署说明.md,Nginx 示例见 nginx.conf.example
四、注意事项
- 不要使用类型强制转换(如
(int)、(string)),遵循项目规范 - 保持 API 响应格式:
{ code, msg, time, data }结构不变 - Token 鉴权:
get_auth_token()逻辑需完整迁移,支持 header、param、server 多种获取方式 - 数据权限:Backend 中的
dataLimit、getDataLimitAdminIds等逻辑需保留 - 异常处理:配置 webman 的异常处理器,统一返回 JSON 格式错误
五、验证清单
迁移完成后,请逐项验证:
- 管理员登录、登出、Token 刷新
- 后台 CRUD 列表、添加、编辑、删除
- 权限校验(noNeedLogin、noNeedPermission)
- 跨域请求正常
- 上传、配置、语言包加载
- 前端已编译项目能正常调用所有 API