“Class 'Yii' not found”是项目骨架缺失或自动加载断裂的明确信号,根源在于未用composer create-project安装、PHP扩展(如mbstring/openssl/pdo_mysql)在CLI模式下未启用,或web/index.php未正确引入vendor/autoload.php。

“Class 'Yii' not found”不是 Yii2 安装失败的表象,而是项目骨架缺失或自动加载断裂的明确信号。它几乎从不源于框架本身,而总出在三处:入口文件没引入 autoload、PHP 扩展未启用、或根本没用对安装方式。
必须用 create-project,别碰 require yiisoft/yii2
这是最常被忽略的前提。手动运行 composer require yiisoft/yii2 只会下载核心代码,不带 web/index.php、不生成 vendor/autoload.php 的完整注册逻辑、也没有 config/ 目录和 yii 命令行工具。结果就是:你连第一行 require __DIR__ . '/../vendor/autoload.php'; 都没机会执行,自然找不到 Yii 类。
- 基础版正确命令:
composer create-project --prefer-dist yiisoft/yii2-app-basic myapp - 高级版正确命令:
composer create-project --prefer-dist yiisoft/yii2-app-advanced advanced,之后务必进目录运行php init - 包名不能简写——
yii2-app-basic必须带yiisoft/前缀,否则拉错仓库
检查 PHP 扩展是否真生效(CLI 模式!)
Win11 下 phpEnv、XAMPP 或 WAMP 常出现 Web 界面显示扩展已启,但命令行(CMD/PowerShell)里却没加载。而 Composer 和 php init 全部走 CLI,这里一塌糊涂,后面全白搭。
- 打开终端,运行
php -v确认 ≥7.4(推荐 8.0–8.2) - 再运行
php -m | findstr "mbstring openssl pdo_mysql curl json xml",缺任一就停手排查 - 若没输出,编辑你 CLI 实际加载的 php.ini(用
php --ini查路径),取消对应extension=行前的分号,并确认extension_dir指向正确的 ext 文件夹(如D:\xampp\php\ext)
入口文件是否真正加载了 autoload
打开 myapp/web/index.php,第一行必须是:
require __DIR__ . '/../vendor/autoload.php';
常见错误包括:
- 路径写成
../../vendor/autoload.php(目录层级不对) - vendor 目录压根不存在——说明 create-project 中途失败或被手动删了
- index.php 被复制到其他位置(比如放进了 Apache 的 htdocs 根目录),导致相对路径失效
验证方法:在 index.php 开头加一行 die('autoload loaded');,访问页面能输出,说明文件被执行;再删掉这行,把 die 换成 var_dump(file_exists(__DIR__ . '/../vendor/autoload.php'));,返回 false 就得重装项目。
别用 phpEnv 跑 Yii2(除非你清楚每一步在改什么)
phpEnv 是静态快照型环境,不管理扩展依赖、不隔离 PHP 版本、且其 CLI 和 Web 使用的 php.ini 常不一致。大量 Win11 用户报的 “Class 'Yii' not found”,实际是 phpEnv 的 CLI 模式根本没加载 openssl,导致 composer install 静默跳过关键包,vendor/autoload.php 生成不全。
- 更稳妥的选择:XAMPP(勾选所有扩展后启动,再用 CMD 进入项目目录操作)
- 或直接使用官方 PHP Windows Binaries(解压即用,配好 PATH 和 php.ini 后,composer 安装极稳定)
- 若坚持用 phpEnv,请先运行
php --ini和php -m双验证,再确保 composer config -g repo.packagist 指向国内镜像(如https://packagist.proxy.fly.dev)











