symfony目录结构严格遵循职责分离:src专用于psr-4自动加载类,命名空间须与路径一致;public为web服务器唯一入口,静态资源必须存放于此;var存放缓存与日志,受配置控制;config和templates按加载顺序覆盖生效。

Symfony安装后目录结构不是随便堆砌的,每个文件夹都承担明确角色,和自动加载、Web服务路径、环境配置强绑定。看懂它,关键在理解“谁负责什么、谁被谁调用、哪里不能乱改”。
src:只放能自动加载的类,命名空间必须对齐
这里不是“你写的PHP文件收纳箱”,而是PSR-4自动加载的专属区域。文件路径和命名空间必须严格一致:
- 文件 src/Utils/Helper.php → 命名空间必须是 AppUtils(不是
Utils或AppHelper) -
composer.json中的 PSR-4 映射(如"App\": "src/")不能删、不能随意改 - 改了命名空间或移动了文件,必须运行
composer dump-autoload,否则类直接报错找不到 - 控制器、实体、服务、表单类型、自定义异常等——只要需被自动加载,就放这儿,按命名空间分层组织
public:Web服务器唯一入口,静态资源必须落在此处
所有HTTP请求必须经由 public/index.php 进入内核,这是硬性安全边界:
- CSS、JS、图片等静态资源必须放在
public/下,或通过php bin/console assets:install软链到public/assets/ - 绝不能把
assets/放进src/或templates/——开发时可能显示,部署后必然 404 - Nginx/Apache 的 root 必须指向
public/,不是项目根目录;否则.env可能被直接下载 -
index.php内部调用Kernel::getEnvironment()判断环境,不要手动改它来“切换环境”
var:运行时工作台,缓存与日志位置受配置控制
var/ 是临时生成区,不是最终归宿,内容随环境和配置动态变化:
-
var/cache/存放编译后的容器、路由、模板等PHP文件,每次改配置或路由后建议清空 -
var/log/默认用 Monolog 写日志,但轮转策略、大小限制由monolog.handler.main配置决定,不靠文件系统自动管理 - 生产环境缓存路径实际由
kernel.cache_dir参数控制,未必落在var/cache下 - 部署时推荐执行
bin/console cache:warmup --env=prod预热,避免首次访问卡顿
config 和 templates:按顺序加载,后定义覆盖前定义
这两个目录的行为依赖加载顺序,直接影响最终配置和视图渲染结果:
- 配置加载顺序:
config/packages/*.yaml→config/packages/<env>/*.yaml</env>→config/services.yaml - 同名参数或服务定义,后加载的会覆盖前面的,比如
config/packages/prod/cache.yaml可覆盖开发时的缓存设置 -
templates/下的Twig文件按继承关系解析,基础模板(如base.html.twig)通常被其他模板{% extends %} - 模板中引用静态资源请用
{{ asset('css/app.css') }},它自动拼接public/路径,不写死相对路径











