Symfony目录结构的核心在于职责边界与运行时角色:src专用于PSR-4自动加载类,public是Web服务器唯一入口,var存放运行时生成的缓存与日志,config和templates按严格顺序加载配置与模板。

看 Symfony 目录结构,关键不是数有多少文件夹,而是理解每个目录的职责边界和运行时角色。它不是静态摆放,而是和自动加载、环境配置、Web 服务器路径强绑定的。
src:只放可自动加载的类,命名空间必须对齐
src 不是“你写的 PHP 文件随便扔的地方”。它专用于存放符合 PSR-4 规范、能被 Composer 自动加载的类文件。
- 文件 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/下,或通过assets:install软链到public/assets/ - 绝不能把 assets 放在
src/或templates/里——开发时可能显示,部署后 404 - Nginx/Apache 的 root 必须指向
public/,不是项目根目录;否则.env可能被直接下载 -
index_dev.php仅用于本地开发调试,生产环境禁用
var:临时工作台,不是最终存储位置
var 是 Symfony 运行时生成缓存、日志、会话等中间产物的默认落点,但它受环境与配置驱动,并非一成不变。
-
var/cache/存编译后的容器、路由、模板等 PHP 文件;改了配置或路由就得清它 -
var/log/默认由 Monolog 写入,轮转策略靠monolog.handler.main配置,不是靠 Linux logrotate 管理 - 生产环境(
APP_ENV=prod)下,kernel.cache_dir可能指向别处,不一定还在var/cache - 部署时建议用
bin/console cache:warmup --env=prod预热,避免首次访问卡顿
config 和 templates:配置与视图的加载有明确顺序
它们不“随便生效”,而是按环境+继承规则逐层覆盖。
- 配置加载顺序:
config/packages/*.yaml→config/packages/<env>/*.yaml</env>→config/services.yaml;后加载的同名参数会覆盖前面的 - 模板查找路径:
templates/bundles/(Bundle 覆盖)→templates/(应用级)→ Bundle 内部模板;可被twig.paths扩展 -
.env和.env.local控制环境变量,但敏感值(如数据库密码)建议用 secrets 方式管理(Symfony 5.3+)


















