不能。gii生成的代码仅为骨架,实际项目中常需重写30–50%逻辑,“省80%”仅适用于全新单表、无权限、无校验、不对接前端框架的极理想场景;其估算源于yii1时期简单后台的粗略统计,现已严重失真。

不能。Gii 生成的代码只是骨架,实际项目中常需重写 30–50% 的逻辑,所谓“省80%”只在极理想场景下成立——比如全新项目、单表、无权限、无业务校验、不对接前端框架、不走 API-first 流程。
为什么“省80%”说法容易误导人
这个数字通常来自早期 Yii1 时期对简单后台管理页的粗略估算,现在已严重失真:
- 它把“生成了文件”等同于“可用代码”,但
rules()里缺密码强度校验、search()里没加模糊查询条件、GridView列里漏掉了password_hash这类字段过滤,这些都得手动补 - 它没算上后续维护成本:一旦数据库加个字段或改外键,Gii 不会自动同步已有模型,你得自己 diff、merge、测试,反而比手写更易出错
- 它默认假设你用的是传统 PHP 渲染页面,而当前主流是 Vue/React 前端 + JSON API,这时 Gii 生成的
views/目录基本作废,只剩Model和部分Controller逻辑能复用
哪些场景下 Gii 确实高效
不是“所有 CRUD 都省事”,而是满足以下条件时,它才真正提速:
- 刚初始化项目,
CREATE TABLE写完立刻要搭后台管理页,比如user、article、category这类标准模型 - 字段命名规范:用
created_at、is_active、status,Gii 才能自动识别时间戳、布尔值、状态枚举并生成对应表单控件 - 有明确外键约束:如
author_id → user.id,Gii 才能生成getAuthor()关联方法和下拉选择逻辑 - 团队接受“生成即审查”流程:每次生成后必须人工检查
rules()、scenarios()、敏感字段暴露、路由权限,而不是直接提交
生成后必须立刻处理的三件事
Gii 输出的代码不是终点,而是起点。跳过这三步,上线后大概率出问题:
-
删掉或重写
rules()里的safe:Gii 默认给所有字段加safe,但像password_hash、auth_key必须改成unsafe,否则用户可通过表单批量赋值篡改 -
补权限控制:
SiteController::actionIndex()生成后默认无鉴权,得加if (!Yii::$app->user->can('viewArticle')) { throw new ForbiddenHttpException(); } -
过滤 GridView 敏感列:Gii 默认把表里所有字段塞进
GridView::widget(['columns' => [...]]),必须手动删掉password_hash、reset_token等列,或用'filter' => false屏蔽
自定义模板才是长期省力的关键
反复修改生成结果,说明你在重复劳动。与其每次手改,不如一次配好模板:
- 把
rules()中的required按字段类型自动分级(如email字段自动加email校验) - 让关联字段默认用
DropdownList而不是文本框,并预置asArray()查询逻辑 - 为时间戳字段自动注入
TimestampBehavior,布尔字段默认渲染成Checkbox - 模板路径配置在
main-local.php的'templates' => ['my' => '@common/gii/templates'],避免污染主配置
真正卡住效率的,从来不是生成动作本身,而是生成后那几处必须改、又总被忽略的硬编码点——比如外键字段名大小写不一致导致属性绑定失败,或者迁移脚本没同步更新导致本地开发环境和 CI 环境行为不一致。











