Yii2.0.55高级版目录结构是为中大型团队协作、前后端分离与安全部署设计的分层架构,必须严格遵循:common/共享模型与配置,frontend/和backend/为独立Web应用,console/执行命令行任务,environments/管理环境配置,web/子目录分别作为前后台入口,@webroot必须指向可写物理路径以保障AssetBundle发布正常。

Yii2.0.55高级版目录结构不是随意堆砌的文件夹,而是为中大型团队协作、前后端分离、环境隔离与安全部署而设计的分层架构,必须严格遵循约定才能让自动加载、别名解析、AssetBundle发布和路由匹配正常工作。
核心目录层级与职责划分
进入项目根目录后,你会看到以下关键目录:
common/ —— 全局共享层:存放所有应用(frontend/backend/console)共用的模型、组件、配置、邮件模板。其中 config/params.php 定义全局参数,models/User.php 被前后台同时继承使用;【任何写在 common/models 下的类,都会被 frontend 和 backend 自动识别,无需额外注册】。
frontend/ 和 backend/ —— 独立Web应用:各自拥有完整的 MVC 结构(controllers/、models/、views/)、独立入口 web/index.php、独立配置 main.php 和 params.php;它们不共享控制器或视图,但通过 common 复用业务逻辑。
console/ —— 命令行应用:用于执行迁移、定时任务、数据导入等后台操作;其 migrations/ 目录被 yii migrate 命令默认扫描,【若 runtime/cache 或 migrations 权限不对,yii migrate 会静默失败而非报错】。
environments/ —— 环境配置枢纽:包含 dev/、prod/、test/ 子目录,每个目录下有 index.php(启用对应环境)和 *.php 配置文件;init 脚本运行时会将 environments/prod 中的配置复制到各应用的 config/ 目录下覆盖本地配置。
web 目录的物理路径与 URL 映射关系
高级模板中不存在单一的“网站根目录”,而是由多个 web 子目录分别承担不同角色:
frontend/web/ 是前台站点入口,Nginx 的 root 应指向此处;index.php 中 require(__DIR__.'/../../vendor/autoload.php') 表明它向上跨越两级找到 vendor;
backend/web/ 是后台管理入口,通常需映射到 /admin 路径;必须修改 backend/web/index.php 中的 $script = $_SERVER['SCRIPT_NAME'],否则 CSRF token path 会错配;
web 目录内 assets/ 不是静态资源原始位置,而是 AssetBundle 发布后的产物目录;css/、js/、images/ 等原始资源应放在 frontend/web/css/ 或 backend/web/js/ 下,由 AssetBundle 引用并自动发布;【若直接把 dist 文件扔进 frontend/web/assets/,Yii 不会识别也不更新,反而导致版本混乱】。
配置加载链与别名展开顺序
第一步:web/index.php 加载 @vendor/autoload.php → 初始化 Composer 自动加载器;
第二步:require Yii.php → 启动框架核心;
第三步:加载 @common/config/main.php → 注册全局组件(如 db、mailer);
第四步:加载 @frontend/config/main.php → 覆盖或合并 common 配置,注入 frontend 特有组件(如 user identityClass);
第五步:Yii::setAlias('@webroot', dirname(__DIR__)); —— 此处 __DIR__ 指向 frontend/web,所以 @webroot 实际为 frontend/ 目录;【@webroot 必须指向 Web 服务器能读取的物理路径,不能是 project-root/frontend,否则 assets 发布失败】;
第六步:@web 别名由 request 组件动态生成,值为 /(根域)或 /myapp/(子目录部署),决定 HTML 中 和 <script> 标签的 baseUrl。</script>
environments/init 的实际作用机制
方法一:命令行初始化(推荐)
执行 php init → 选择 prod 环境 → 输入 root 密码确认 → 脚本自动将 environments/prod/*.php 复制到 common/config/、frontend/config/、backend/config/ 对应位置;
复制过程不覆盖已存在的 local 配置文件(如 params-local.php),但会强制覆盖 main-local.php 以外的所有 main.php;
方法二:手动同步(仅调试用)
直接 cp environments/prod/main.php frontend/config/main.php;但必须同步修改 frontend/config/params.php 中数据库 host、username 等字段,否则上线即连不上库;
注意:environments 目录本身不参与自动加载,init 只是单次拷贝动作;后续 config 修改必须重新运行 init 或手动同步,否则 prod 配置不会生效。
runtime 目录的权限与敏感性
第一步:确保 runtime/ 及其子目录(cache/、logs/、assets/、data/)对 Web 服务器用户(如 www-data)可写;
第二步:禁止将 runtime/ 放在 Web 可访问路径下;检查 Nginx 配置是否包含 location ~ ^/runtime { deny all; };
第三步:runtime/assets/ 是 AssetBundle 发布目标,每次清空该目录后首次访问页面会自动重建;但若 chmod 755 assets/ 而非 775,PHP 进程可能因无写权限卡住,浏览器显示空白页且无错误日志;
第四步:runtime/logs/app.log 记录所有 error/warning,当页面白屏时,第一反应是 tail -f runtime/logs/app.log,而不是看浏览器控制台。


















