ThinkPHP6 的 think:build 命令不带 CRUD 方法,因其仅生成空骨架;think:curd 是第三方扩展,需手动安装、配置并修改模板才能生成含搜索、分页、软删除等功能的代码,且验证规则需根据数据库元信息手动补全。

thinkphp6 的 think:build 命令为什么生成的代码不带 CRUD 方法?
因为 ThinkPHP 官方内置的 think:build 命令只生成空控制器、模型和验证器骨架,不生成任何业务逻辑代码——它压根不是 CRUD 生成器。think-curd(注意拼写是 curd 而非 crud)是第三方扩展,必须手动安装并替换默认命令。
常见错误现象:php think build 运行后只有空类,字段没映射,index/save 方法全无;或者报错 Command not found: think:curd。
- 先执行
composer require liuferen/think-curd(注意作者名和包名,别装错成其他同名但已废弃的版本) - 确认
config/console.php中已注册该命令:检查是否存在'liuferen\thinkcurd\command\Build'到'think:curd'的映射 - 数据库表必须有规范命名(如
user表对应UserModel),否则字段识别失败或模型类名错乱
怎么让 think:curd 生成带搜索、分页、软删除的控制器?
靠模板文件控制输出内容,不是靠参数开关。默认模板极简,要加功能就得改模板,而不是调命令时加个 --with-search 这种不存在的选项。
使用场景:你刚建好 article 表,想一键生成带列表搜索框、状态筛选、回收站入口的后台控制器。
立即学习“PHP免费学习笔记(深入)”;
- 模板路径在
vendor/liuferen/think-curd/src/template/,重点修改controller.tpl和index.tpl - 在
controller.tpl的index方法里插入$this->request->param()解析搜索条件,并加进where查询链 - 分页直接用
$list = $model->paginate(15),别手写limit+offset - 软删除需确保模型开启
use SoftDelete,且模板中对delete操作生成的是deleteTime赋值而非destroy
think:curd 生成的验证规则为什么总和数据库字段对不上?
因为模板读取的是数据库 information_schema 元信息,但会跳过注释、忽略 tinyint(1) 是否为布尔类型、把 datetime 统一当字符串处理——它不解析 Laravel 风格的迁移文件,也不读 Eloquent 注释。
性能影响:每次生成都会连一次数据库查字段类型,本地开发没问题,CI 环境若数据库不可达则命令直接失败。
- 手动补全
rule数组:比如数据库字段是status tinyint unsigned,模板可能只生成'status' => 'require|number',你要加上|in:0,1,2 - 时间字段(
create_time)在验证器里应设为'date'或留空(由模型自动填充),别写'require|date'导致新增时必填 - 如果用了 JSON 字段(如
extra json),模板不会自动加json验证,得自己加|json
自定义模板后,为什么新表生成还是老样子?
因为 think:curd 默认加载的是 vendor 里的原始模板,不是你改过的那个文件。它不支持通过配置指定模板路径,必须硬链接或复制覆盖。
容易踩的坑:在项目根目录新建 template/ 文件夹放修改后的 tpl,却没告诉命令去哪读——它根本不会看。
- 找到实际生效的模板位置:
vendor/liuferen/think-curd/src/template/(不是resource/template) - 直接编辑该目录下的
controller.tpl、model.tpl等,不要试图用配置项切换 - 改完记得清缓存:
php think clear,否则可能读到旧的编译后视图缓存 - 升级
think-curd包时,这些改动会被覆盖,建议用 git diff 记录变更,升级后重新打补丁
模板定制不是“配一下就一劳永逸”,它绑定在具体版本的 vendor 文件上,每次更新都要人工核对。最稳的方式是 fork 作者仓库,在自己分支里维护模板,然后 composer require 指向私有 Git 地址。











