yii2源码位于vendor/yiisoft/yii2/,核心目录包括base/(基础类)、di/(依赖注入)、web/(web特有类)、log/(日志)、helpers/(工具类);本地vendor代码是可用快照,优于github开发版,推荐用ide跳转或按命名空间转换路径定位文件。

Yii 框架的源码不在你项目目录里“藏着”,它就明明白白地放在 vendor/yiisoft/yii2/ 下——这是 Composer 安装后默认路径,也是你读源码的第一站。
怎么看 vendor/yiisoft/yii2/ 目录结构
这个目录就是 Yii2 的完整核心代码仓库(非 Git 仓库,是 Composer 下载的发布版)。关键子目录有:
-
base/:最基础的类,比如Object、Component、Module、Model、Controller都在这儿 -
di/:依赖注入容器实现,Container类和相关逻辑 -
log/:日志系统,Logger、Target等 -
web/:Web 特有类,如Application、Request、Response、Controller(继承自base/Controller) -
helpers/:静态工具类,ArrayHelper、StringHelper、Url等 -
yii文件:根命名空间入口,定义了Yii全局辅助类(含getAlias、setAlias、autoload)
别试图从 index.php 一路 require 追到底——直接打开 vendor/yiisoft/yii2/base/Module.php 或 vendor/yiisoft/yii2/web/Application.php 就是正解。
为什么不能只看 GitHub 上的 yii2 repo?
GitHub 上的 yiisoft/yii2 是开发主干,含大量未发布分支、测试代码、构建脚本,且 PHP 文件常被 PSR-4 自动加载器“拆散”。而你本地 vendor/ 里的代码是经过 composer install 处理后的可用快照,类文件一一对应命名空间,use yii\base\Module; 就真能定位到 vendor/yiisoft/yii2/base/Module.php。阅读时以本地文件为准,GitHub 仅作查 commit、issue、RFC 参考。
怎么快速定位某个类的源码位置?
用 IDE(如 PHPStorm)直接 Ctrl + Click(或 Cmd + Click)跳转最可靠;若手动查:
- 确认类的完整命名空间,例如
yii\web\Controller - 把
\替换为/,去掉开头yii,得到相对路径:web/Controller.php - 拼到
vendor/yiisoft/yii2/后面,即:vendor/yiisoft/yii2/web/Controller.php - 注意:有些类在
base/定义,web/中只是继承或重写(如Controller),得两边都看
别漏掉 yii\BaseYii::classMap——它缓存了部分核心类的绝对路径,是自动加载的快捷通道,但不是源码本身。
alias(别名)是源码阅读的绊脚石?
不是绊脚石,是钥匙。@yii 默认指向 vendor/yiisoft/yii2/,所以 Yii::getAlias('@yii/base/Module') 就是 vendor/yiisoft/yii2/base/Module.php 的路径。所有带 @ 前缀的路径(如 @app、@runtime)最终都靠 BaseYii::$aliases 映射到真实磁盘路径。读源码前先确认 YII2_PATH 和 BaseYii::$aliases['@yii'] 是否一致——不一致说明环境被改过,可能跳转错位。
真正容易被忽略的是:模块类(如 app\modules\v1\Module)的 basePath 默认取自自身类文件所在目录,而不是 @app;而它的 controllerNamespace 默认拼出 app\modules\v1\controllers,再经 Yii::getAlias() 转成物理路径——这两层映射一旦配置错,new Module() 不报错,但控制器死活找不到。











