require中的包用于生产环境,require-dev仅用于开发测试;前者影响autoload.php生成,后者在CI/CD中通常被忽略。

composer.json 里 require 和 require-dev 的区别必须分清
require 里的包会打进生产环境,require-dev 只在本地开发和测试时加载。如果把 phpunit/phpunit 写进 require,上线后就会多载一堆没用的类,还可能引发 autoloader 冲突。
- Yii 应用启动时只加载
vendor/autoload.php,它由 composer 自动生成,内容完全取决于require列表 -
require-dev中的包不会出现在autoload.php的 classmap 或 psr-4 映射里,除非你手动执行composer install --dev - CI/CD 流水线部署时,通常跑
composer install --no-dev,这时require-dev里的东西根本不存在
Yii 扩展的 autoload 配置不能靠猜
很多 Yii 扩展(比如 yii2-debug、yii2-gii)在 composer.json 里声明了 autoload 段,但它们用的是 psr-4 还是 classmap?不看源码或包的根目录 composer.json 就直接假设,容易导致模块找不到类。
-
yii2-debug是psr-4:"yii\debug\": "src/",所以你要确保它的src/在 vendor 目录下可读 -
yii2-jui是classmap:它把所有 widget 类列在classmap数组里,不依赖命名空间路径,但更新后必须重跑composer dump-autoload - 如果你自己写扩展,别漏掉
autoload声明,否则 Yii 的Yii::createObject()无法自动实例化你的类
版本约束写错会导致 Yii 主版本升级失败
Yii2 和 Yii3 的依赖兼容性完全不同。比如你在 Yii2 项目里写了 "yiisoft/yii2": "^2.0.0",看起来没问题,但一旦有人手误改成 "^3.0.0",composer update 就会拉下 Yii3,而 Yii3 不兼容 yiiaseComponent 的老写法,整个应用直接报 Class 'yiiaseComponent' not found。
- Yii2 官方推荐用
"yiisoft/yii2": "~2.0.49"这种波浪号写法,只允许补丁级更新 - Yii3 要用
"yiisoft/yii-core": "^3.0",且必须搭配"yiisoft/di": "^3.0"等配套包,少一个就new Container()失败 - 运行
composer why-not yiisoft/yii2:2.0.49可快速定位哪个包卡住了升级路径
自定义 autoload 路径要避开 Yii 的自动扫描逻辑
你想把模型类放在 app/models/ 下,又不想每加一个类就改 composer.json,于是加了 "psr-4": {"App\Models\": "app/models/"} —— 表面上能用,但 Yii 的 Module::getControllerPath() 和 Gii 生成器会按约定找 controllers/、models/,此时它认的是相对路径,不是命名空间映射。
- 这种写法会让
AppModelsUser类被加载,但 Gii 创建新模型时仍默认写进models/目录,和你配置的命名空间对不上 - 更稳妥的做法是保持目录结构与命名空间一致,比如用
"App\": "src/",然后把所有代码放进src/Models/(注意 PascalCase),再让 Yii 的bootstrap配置指向它 - 别在
autoload里加files数组去 require 全局函数文件,Yii 的Yii::setAlias()和自动加载机制不识别这种加载方式,容易出现「函数已定义」或「找不到函数」的冲突
composer.json 时,最常出问题的不是语法,而是没想清楚「这个包谁用、什么时候用、用的时候有没有其他依赖在场」。特别是跨大版本升级,光看文档不如直接 composer show yiisoft/yii2 看它到底 require 了啥。


















