Composer是Yii项目启动前提,不用就起不来:vendor/autoload.php不生成则类找不到,php yii migrate报错,gii/debug模块装了也无法访问;必须用create-project初始化,require与require-dev不可混用,扩展安装后还需在config中显式配置modules。

Yii 项目离不了 Composer,不是“用了更好”,而是“不用就起不来”——vendor/autoload.php不生成,Yii::createObject()找不到类;php yii migrate直接报错;gii或debug模块即使装了也进不去页面。所有问题根源都在 composer.json 结构、安装方式和配置联动这三环上。
composer create-project 是唯一安全的起点
别从 GitHub clone Yii 仓库,也别手动下载 zip 解压。这些操作跳过 Composer 初始化流程,缺 composer.lock、没自动注册的 autoload 规则、post-create-project-cmd 钩子不执行,后续所有依赖都可能错位。
- Yii 2 项目用:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic - Yii 3 项目用:
composer create-project --prefer-dist yiisoft/app myapp - 执行后立刻检查:根目录有
composer.json和vendor/,且vendor/autoload.php可被正常引入
require 和 require-dev 混用会直接拖垮生产环境
很多线上响应变慢、调试信息泄露、甚至 500 错误,都是因为把 yiisoft/yii2-debug 或 phpunit/phpunit 错塞进了 require。CI/CD 流水线默认跑 composer install --no-dev,此时 require-dev 内容根本不会出现在 vendor/ 里,但 require 里的开发包却照常加载。
-
require:只放运行时必需的包,如yiisoft/yii2、yiisoft/yii2-redis、ext-pdo_mysql -
require-dev:仅限本地开发用的包,如yiisoft/yii2-debug、phpunit/phpunit、codeception/codeception - 验证归属:运行
composer show(看生产依赖)和composer show --dev(看开发依赖)
composer require 装完扩展,Class not found?那是没配 modules/components
执行 composer require yiisoft/yii2-gii 成功,不代表你能访问 /index.php?r=gii。Composer 只负责把类文件放进 vendor/ 并更新 autoload.php;能否被 Yii 实例化,取决于是否在配置中声明了 modules 或 components。
-
yii2-gii必须在config/web.php的modules中显式注册:'gii' => ['class' => 'yiigiiModule'],并加入'bootstrap' => ['gii'] -
yii2-debug同理:'debug' => ['class' => 'yiidebugModule'],且需确保它不在require里(否则生产环境也会加载) - 某些扩展带迁移文件,比如
yiisoft/yii2-authclient,装完还得手动运行:php yii migrate --migrationPath=@vendor/yiisoft/yii2-authclient/migrations
版本约束写错,一次 update 就让整个应用崩溃
把 "yiisoft/yii2": "^2.0.0" 改成 "^3.0.0" 看似只是数字变化,实际是跨大版本升级。Yii 3 不兼容 yiiaseComponent 的老写法,new yiiaseComponent() 直接报错,连入口文件都过不去。
- Yii 2 项目锁定补丁更新:
"yiisoft/yii2": "~2.0.49"(只允许 2.0.49 → 2.0.50 这类) - Yii 3 项目必须配齐配套包:
"yiisoft/yii-core": "^3.0"+"yiisoft/di": "^3.0"+"yiisoft/log": "^3.0",少一个new Container()就失败 - 排查卡点:运行
composer why-not yiisoft/yii2:2.0.49,能快速定位哪个依赖阻止你升级
最常被忽略的其实是 autoload 和 Yii 约定路径的错位——比如你加了 "psr-4": {"App\Models\": "app/models/"},类能自动加载,但 Gii 生成器仍按 @app/models 的相对路径找模板,Module::getControllerPath() 也不认这个命名空间映射。Composer 管的是“能不能 new”,Yii 框架管的是“该不该 new”,两者得对齐,不能只看类是否存在。











