Symfony 8.1.9 WebApp默认采用扁平化、属性驱动结构,摒弃传统Bundle模式;核心目录为config/、src/(含Controller/Entity/等约定子目录)、templates/、public/、migrations/、var/,强调简洁性与现代PHP实践。

Symfony 8.1.9 的 WebApp 项目默认采用扁平化、面向现代 PHP(≥8.1)和属性驱动的结构,不再强调传统“bundle”组织方式。它更聚焦于应用本身,目录精简、职责清晰,适合中小型 Web 应用快速启动与长期维护。
核心目录结构说明
使用 symfony new my_project --webapp 创建后,典型结构如下:
-
config/:存放所有配置文件(YAML/PHP),包括框架、路由、数据库、缓存等。
packages/下按功能分组(如doctrine.yaml、framework.yaml),routes.yaml已退居次要地位,主路由推荐用#[Route]属性定义。 -
src/:PHP 源码根目录。无强制子目录(如 Controller/、Entity/),但约定俗成包含:
–Controller/:含带#[Route]的控制器类;
–Entity/:Doctrine 实体类(配合 PHP 属性映射,如#[ORM\Entity]);
–Repository/:自定义仓储类;
–Kernel.php:应用入口内核,轻量且极少需修改。 -
templates/:Twig 模板统一存放处,支持嵌套目录(如
blog/index.html.twig)。路径自动映射到控制器返回的模板名,无需额外配置。 -
public/:Web 服务器文档根目录。仅含
index.php(前端控制器)和静态资源(css/、js/、images/)。不建议直接放 PHP 脚本或敏感文件。 - migrations/:Doctrine Migrations 生成的版本化数据库变更脚本(PHP 类),用于安全升级/回滚 schema。
- var/:运行时生成目录(缓存、日志、会话)。Git 中默认忽略,部署时由 Symfony 自动重建。
关键变化点(相比 Symfony 5/6)
Symfony 8.1.9 进一步收窄“约定优于配置”边界,突出简洁性:
- 移除了
src/Command/默认目录,命令类可放在任意位置,只要被自动加载(PSR-4)且继承Command;推荐仍放src/Command/保持可读性。 - 不再生成
tests/目录(除非显式加--full),单元测试需手动初始化(composer require --dev phpunit/phpunit)。 -
bin/console是唯一 CLI 入口,cache:clear、doctrine:migrations:migrate等均通过它调用;无app/console遗留路径。 - 环境变量统一由
.env和.env.local管理,config/bootstrap.php自动加载,不再需要AppKernel或复杂环境判断逻辑。
实际开发中建议的补充结构
为提升可维护性,可按需添加以下目录(非 Symfony 强制,但社区广泛采纳):
-
dto/(或
src/Dto/):存放数据传输对象,配合#[MapRequestPayload]属性做请求参数自动绑定与验证。 -
exception/(或
src/Exception/):自定义业务异常类,便于全局异常处理器(ExceptionController)统一响应格式。 -
EventListener/ 或 Subscriber/:存放事件监听器,响应
kernel.request、kernel.response等核心事件。 -
assets/:存放原始前端资源(Sass、TypeScript),配合
symfony/webpack-encore-bundle编译后输出至public/。


















