yii高级模板是为多端分离设计的预置骨架,frontend和backend为独立web应用,各拥入口、配置与视图;common仅放跨应用复用的模型、基础组件和全局参数,vendor为composer依赖唯一来源,environments仅负责配置文件复制。

Yii 高级模板(advanced)不是“必须照搬”的结构,而是为多端分离场景设计的预置骨架。你不需要硬套它,但得清楚每个目录的职责边界和加载路径,否则改配置、加模块、部署时会反复踩坑。
frontend 和 backend 目录本质是独立 Web 应用
它们各自拥有完整的 web/index.php 入口、config/ 配置、controllers/ 和 views/,彼此不共享控制器或视图文件。common 下的 models 或 components 可被两者引用,但 frontend 的 SiteController 对 backend 完全不可见。
- 修改 frontend 的路由,不会影响 backend 的 URL 解析
-
frontend/config/main.php中的'components'仅作用于 frontend,哪怕名字和 backend 一样,也是两个独立实例 - 若在 frontend 中 use common\models\User,实际加载的是
common/models/User.php;但若在 frontend\models 下也建了个User.php,PHP 自动加载器会优先取本目录下的,导致意外交互
common 目录只放真正跨应用复用的代码
很多人把所有“看起来通用”的类都塞进 common,结果造成耦合和启动变慢。common 应只包含:模型类(如 User、Post)、基础组件(如 MailHelper)、全局配置项(params.php)——且这些类不能依赖 frontend 或 backend 特有路径或配置。
-
common/config/params.php被 frontend/backend/console 同时加载,适合放'adminEmail' => 'admin@example.com'这类纯数据 - 不要在 common\models\User 中调用
Yii::$app->user->identity,因为 console 应用没有user组件,一运行就报Calling unknown method: yii\console\Application::getuser() - common 下不要放控制器、视图、迁移(migrations 属于具体应用,应放在 frontend/migrations 或 backend/migrations)
vendor 是框架与扩展的唯一可信来源
所有通过 composer require 安装的包,包括 yiisoft/yii2 本身,都落在 vendor/。你永远不该手动修改 vendor 里的任何文件,也不该把自定义类“假装”成 vendor 包来 autoload。
- 若想覆盖 Yii 某个核心类(比如
yii\web\User),正确做法是在common/components/下新建MyUser.php并在 config 中设置'user' => ['class' => common\components\MyUser::class] - 执行
php yii migrate时,默认读取的是当前所在目录(如 frontend/)下的 migrations,不是 common 的;要跑公共迁移,需显式指定路径:php yii migrate --migrationPath=@common/migrations -
vendor/autoload.php在每个入口脚本(frontend/web/index.php等)中被引入一次,之后所有 PSR-4 类自动按命名空间映射,无需再 require
environments 目录控制配置差异化而非代码逻辑
它只负责把 common/config/main-local.php、frontend/config/main-local.php 这类本地配置文件,从 environments/dev/ 或 environments/prod/ 复制过去。它不改变目录结构,也不参与运行时加载。
- 执行
./init时选择环境,只是复制动作;之后改environments/prod/frontend/config/main-local.php不会自动同步到已部署的服务器上 - 数据库密码、API 密钥等敏感信息必须放在
*-local.php中,并确保该文件不在 Git 提交列表里(检查.gitignore是否含*/config/*-local.php) - 不要在 environments 下写业务逻辑,比如 “开发环境启用 debug toolbar”,这个应该由
frontend/config/main.php中的条件判断完成:if (YII_ENV_DEV) { $config['bootstrap'][] = 'debug'; }
最常被忽略的一点:高级模板里没有任何一个目录是“强制存在”的。你可以删掉 backend,只留 frontend + console;也可以把 console 合并进 frontend 的 commands,只要改入口和配置。关键不是目录名,而是 index.php 中 require __DIR__ . '/../../vendor/autoload.php'; 和 (new yii\web\Application($config))->run(); 这两行怎么连通代码与框架。目录只是约定,加载链才是真相。











