6.8 KiB
CRUD 代码生成逻辑说明
参考 ThinkPHP8 与 Webman 实现,说明各配置项含义及生成流程。
一、配置项说明
1. 生成代码的相对路径(generateRelativePath)
作用:作为路径前缀,用于快速组合生成位置。支持多级目录,如 crud/test 会生成到 crud/test 子目录。
逻辑:
- 输入值会替换
/为\后作为table参与路径计算 - 与表名等价:
test和crud/test都会触发getFileData获取默认路径 - 为空时,需先填写数据表名,由表名驱动路径计算
示例:
test→ 控制器app/admin/controller/Test.php,视图web/src/views/backend/test/crud/test→ 控制器app/admin/controller/crud/Test.php,视图web/src/views/backend/crud/test/
2. 生成的控制器位置(controllerFile)
作用:控制器文件的相对路径,如 app/admin/controller/crud/Test.php。
逻辑:
- 由
Helper::parseNameData('admin', $tableName, 'controller', $table['controllerFile'])计算 - 为空时:按表名解析,如
test→app/admin/controller/Test.php - 有值时:按自定义路径解析,会去掉
app/admin/controller前缀后按剩余部分生成
Webman 适配:与 ThinkPHP 相同,目录为 app/admin/controller/。
3. 生成的数据模型位置(modelFile)
作用:模型文件的相对路径,如 app/admin/model/crud/Test.php 或 app/common/model/Test.php。
逻辑:
- 由
Helper::parseNameData($app, $tableName, 'model', $table['modelFile'])计算 $app由「公共模型」决定:勾选为common,否则为admin- 为空时按表名解析
Webman 适配:与 ThinkPHP 相同,目录为 app/admin/model/ 或 app/common/model/。
4. 生成的验证器位置(validateFile)
作用:验证器文件的相对路径,如 app/admin/validate/crud/Test.php。
逻辑:
- 由
Helper::parseNameData($app, $tableName, 'validate', $table['validateFile'])计算 - 与模型使用相同的
$app(公共模型或 admin)
Webman 适配:与 ThinkPHP 相同,目录为 app/admin/validate/ 或 app/common/validate/。
5. WEB 端视图目录(webViewsDir)
作用:前端 Vue 视图目录,如 web/src/views/backend/test。
逻辑:
- 由
Helper::parseWebDirNameData($tableName, 'views', $table['webViewsDir'])计算 - 生成
index.vue、popupForm.vue及对应语言包 - 为空时按表名解析,如
test→web/src/views/backend/test
Webman 适配:与 ThinkPHP 相同,目录为 web/src/views/backend/。
6. 数据库连接配置标识(databaseConnection)
作用:选择使用的数据库连接,对应 config/thinkorm.php 中 connections 的 key。
逻辑:
- ThinkPHP:
config('database.connections') - Webman:
config('thinkorm.connections'),Ajax 的getDatabaseConnectionList已适配 - 留空使用默认连接:
config('thinkorm.default', 'mysql')
Webman 适配:已从 database.php 迁移到 thinkorm.php,无需额外修改。
二、自动填充流程
当数据表名或生成代码的相对路径变化时:
- 前端调用
getFileData(table, commonModel) - 后端
Crud::getFileData根据表名和是否公共模型计算默认路径 - 返回并填充:
modelFilecontrollerFilevalidateFilewebViewsDir
若这些字段为空,可能原因:
- 从零新建:需先输入数据表名(如
test),输入后会自动调用getFileData填充(输入过程中 400ms 防抖触发,无需失焦) - 表名格式需符合
^[a-z_][a-z0-9_]*$(小写字母、数字、下划线) - 「高级配置」默认展开,可直接看到控制器/模型/验证器/视图路径
getFileData接口异常(可检查网络或后端日志)getFileData已加入noNeedLogin,无需登录即可获取路径(便于设计页加载)
三、generate 生成流程
1. 接收 table、fields 等参数
2. 表设计:handleTableDesign(创建/更新表结构)
3. 路径解析:
- modelFile = parseNameData(admin|common, tableName, 'model', table.modelFile)
- validateFile = parseNameData(...)
- controllerFile = parseNameData('admin', tableName, 'controller', table.controllerFile)
- webViewsDir = parseWebDirNameData(tableName, 'views', table.webViewsDir)
4. 遍历字段,生成:
- 模型(Model)
- 控制器(Controller)
- 验证器(Validate)
- index.vue、popupForm.vue
- 语言包(zh-cn、en)
5. 创建菜单(AdminRule)
四、Webman 与 ThinkPHP 差异
| 项目 | ThinkPHP | Webman |
|---|---|---|
| 数据库配置 | config/database.php |
config/thinkorm.php |
| 默认连接 | config('database.default') |
config('thinkorm.default') |
| 根路径 | root_path() |
root_path()(同,指向 dafuweng-webman 项目根) |
| 控制器初始化 | initialize() 自动调用 |
在 initializeBackend 中调用 $this->initialize() |
| XSS 过滤 | $request->filter('clean_xss') |
$inputFilter = 'clean_xss',由 Backend trait 在 add/edit 时应用 |
五、路径解析规则(Helper)
parseNameData($app, $table, $type, $value)
$value为空:按$table解析,下划线_拆分为目录,末段大驼峰为类名$value有值:按自定义路径解析,会去掉app/$app/$type前缀- 预设:
admin→auth/admin,admin_rule→auth/rule等
示例(表名 xxx_yyy_zzz,均相对于 dafuweng-webman 项目根):
| 配置项 | 默认值 | 公共模型时 |
|---|---|---|
| 生成代码的相对位置 | xxx_yyy_zzz |
- |
| 控制器 | app/admin/controller/xxx/yyy/Zzz.php |
- |
| 模型 | app/admin/model/xxx/yyy/Zzz.php |
app/common/model/xxx/yyy/Zzz.php |
| 验证器 | app/admin/validate/xxx/yyy/Zzz.php |
app/common/validate/xxx/yyy/Zzz.php |
| WEB端视图目录 | web/src/views/backend/xxx/yyy/zzz |
- |
规则: 表名 xxx_yyy_zzz → 前段 xxx、yyy 为子目录(小写),末段 zzz 转为 Zzz.php(大驼峰);视图目录保持全小写。
parseWebDirNameData($table, $type, $value)
$type='views':生成web/src/views/backend/{path}/{name},如xxx_yyy_zzz→web/src/views/backend/xxx/yyy/zzz$type='lang':生成web/src/lang/backend/{lang}/{path}/{name}