新手应直接用composer create-project yiisoft/yii2-app-basic basic-app创建项目,web根目录必须设为basic-app/web/,否则报class 'yii' not found;php内置服务器需用php -s localhost:8000 -t web/ web/index.php启动,漏-t web/则静态资源404。

别从“Yii是什么”开始学,直接用它写一个能跑通的用户注册页,比读十页文档更管用。 Yii 不是靠背概念掌握的,它是一套高度约定的工具链,卡住你的永远不是语法,而是它默认行为和你直觉之间的偏差。
怎么快速跑通第一个 Yii 2 Basic 应用
新手最容易卡在环境初始化阶段,不是代码写错,而是路径或权限没对:
- 必须用
composer create-project yiisoft/yii2-app-basic basic-app创建项目,别手动复制文件——vendor/里一堆自动注册的 autoloader 和 bootstrap 逻辑依赖 Composer 的安装流程 - Web 根目录必须指向
basic-app/web/,不是项目根目录;否则index.php找不到../vendor/autoload.php,报Class 'Yii' not found - 如果用 PHP 内置服务器,运行命令得是
php -S localhost:8000 -t web/ web/index.php,漏掉-t web/就会 404 所有静态资源
ActiveRecord 查询总返回 null?检查这三处
不是模型写错了,大概率是数据库连接或表结构不匹配:
-
config/db.php中的dsn必须显式带数据库名,比如mysql:host=localhost;dbname=myapp,光写mysql:host=localhost会导致连接成功但查不到表 - Model 类名必须和数据表名严格对应(默认开启
tableName()自动推导),User类对应user表;若表名是tbl_user,必须重写public static function tableName() { return 'tbl_user'; } -
find()->where(...)->one()返回null时,先用find()->where(...)->createCommand()->getRawSql()打印 SQL,再拿去 MySQL CLI 里执行——常发现字段名拼错、大小写敏感(Linux 下表名区分大小写)或字符集不一致导致WHERE匹配失败
Gii 生成的 CRUD 不能直接上线?这些默认项必须改
Gii 是加速器,不是终点。它生成的代码在安全和健壮性上留了大量缺口:
- 控制器里
actionCreate()默认没做事务包裹,插入主表+关联表失败时会脏数据;要手动加$transaction = \Yii::$app->db->beginTransaction();和try/catch/rollback - 表单模型的
rules()只校验必填和类型,密码字段必须额外加['password', 'string', 'min' => 6]和['password_repeat', 'compare', 'compareAttribute' => 'password'] - Gii 生成的视图里
ActiveForm::begin()默认开启 CSRF 验证,但如果前端用 AJAX 提交,需在 JS 里读取meta[name="csrf-param"]和meta[name="csrf-token"]并附到请求头,否则 400 错误
调试时 var_dump() 失效?优先看 Yii 的日志和 trace
Yii 把错误吞得太干净,直接输出容易错过上下文:
- 打开
config/web.php,确保'log' => ['targets' => [...]]已启用,并把YII_DEBUG设为true;否则Yii::error()什么都不会写 - 想看某段代码的执行路径,别用
var_dump(),改用Yii::trace('here at line X', __METHOD__),日志会自动带上调用栈 - 数据库慢查询不会报错,但会在
runtime/logs/app.log里标记[slow query],配合yii\db\Connection::enableLogging = true可看到完整 SQL 和耗时
最常被跳过的其实是配置文件的加载顺序:main.php → params-local.php → main-local.php,本地覆盖项写错文件就完全不起作用;还有 web/index.php 顶部那两行 defined('YII_DEBUG') 和 require __DIR__ . '/../vendor/autoload.php',顺序颠倒或路径写错,整个应用就静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











