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

刚装完 Symfony 7.4,看到一堆文件夹却不知道哪个该写代码、哪个动不得?别急——它的目录不是随意排列的,而是按职责严格划分:谁加载类、谁响应请求、谁存缓存、谁管配置,都有明确归属。看懂结构,等于拿到项目运行的“电路图”。
src:只放能自动加载的类,路径即命名空间
这里不是“你写的PHP文件随便扔的地方”,而是 PSR-4 自动加载的专属区域。规则很硬:
- 文件 src/Security/JwtAuthenticator.php → 命名空间必须是 AppSecurity(不能少 App,也不能多一层)
-
composer.json 里的
"App\": "src/"映射不能删、不能改成"MyApp\": "src/" - 改了类名、挪了文件位置,必须立刻执行
composer dump-autoload,否则运行时报 “Class not found” - 控制器、实体、表单、自定义异常、事件订阅器……只要需要被 new 或注入,就放这儿,按命名空间分层建子目录
public:Web服务器唯一入口,静态资源必须落在此处
所有 HTTP 请求都从 public/index.php 进入,这是不可绕过的安全边界:
- CSS、JS、图片等静态资源,必须直接放在 public/css/、public/images/ 下;或用
php bin/console assets:install软链到 public/assets/ - 绝不能把 assets/ 放进 src/ 或 templates/ ——本地开发可能显示,上线后 Nginx/Apache 找不到,必 404
- Web 服务器(Nginx/Apache)的 root 必须指向 public/,不是项目根目录;否则 .env 文件可能被直接下载暴露
-
index.php 内部通过
Kernel::getEnvironment()判断环境,不要手动改它来“切环境”
config 和 templates:后加载的配置和模板会覆盖前面的
这两个目录的行为依赖加载顺序,直接影响最终行为:
- 配置加载顺序:config/packages/*.yaml → config/packages/dev/*.yaml(或 prod/test)→ config/services.yaml
- 同名服务或参数,后面加载的会覆盖前面的;比如 config/packages/prod/cache.yaml 可覆盖开发时的缓存驱动设置
- templates/ 下的文件按继承关系生效:子模板可覆盖父模板的 block;templates/bundles/ 下的文件可覆盖第三方 Bundle 的默认模板
- 不要在 templates/ 里放 PHP 逻辑,Twig 是视图层,数据应在控制器中准备并传入
var:运行时生成区,内容随环境动态变化
var/ 不是归档目录,而是运行期工作台,内容不建议手动修改:
- var/cache/ 存编译后的容器、路由、Twig 模板等 PHP 文件;改了 YAML 配置或注解路由后,建议清空再试
-
var/log/ 默认用 Monolog 记录日志;轮转策略、最大大小由
monolog.handler.main配置控制,不是靠文件系统自动清理 - 生产环境实际缓存路径由
kernel.cache_dir参数决定,可能被重定向到 /tmp 或其他位置 - 部署时推荐执行
bin/console cache:warmup --env=prod预热,避免用户首次访问卡顿











