作为 Symfony 的新手并从 4.2 版开始,我遇到了与 @DeveloperMobile 相同的问题。
目录结构
这是我的目录结构,基于 Guide
Symfony Best Practices Version 4.2的建议
该建议基本上是关于结构的:
- 将所有Controllers放在/src/Controller中,按Subfolder划分
- 不要使用捆绑包,按命名空间组织代码
- 将资产、配置、测试、模板、翻译、var/cache 和 var/log 放入根文件夹
- 在 /src 中组织您的业务逻辑
- 使用自动装配来自动配置应用程序服务。
- 使用依赖注入获取服务
- 瘦控制器和胖模型
所以基本上它说:是的,您可以使用子文件夹在 /src 中组织您的代码,但是具有特定功能的代码,如控制器、实体、表单、存储库等应该在特定的目录中。
执行
root/
├─ assets/
├─ bin/
│ └─ console
├─ config/
└─ public/
│ └─ index.php
├─ src/
├─ Controller/
├─ DefaultController.php
├─ ...
├─ Api/
│ ├─ ..
│ └─ ..
├─ Backend/
│ ├─ ..
│ └─ ..
├─ Entity/
├─ Form/
├─ Repository/
├─ Twig/
├─ Utils/
└─ Kernel.php
├─ tests/
├─ templates/
├─ translations/
├─ var/
│ ├─ cache/
│ └─ log/
└─ vendor/
最佳实践 Symfony 4.2
这是上面链接中所有建议的列表:
安装
- 使用 Composer 和 Symfony Flex 创建和管理 Symfony 应用程序。
- 使用 Symfony Skeleton 创建新的基于 Symfony 的项目。
结构
配置
商业逻辑
对于大多数项目,您应该将所有代码存储在 src/ 目录中。在这里,您可以创建任何想要组织事物的目录:
- 使用自动装配来自动配置应用程序服务。
- 应用程序服务的 id 应该等于它们的类名,除非您为同一个类配置了多个服务(在这种情况下,使用蛇案例 id)。
- 服务应尽可能私有。这将阻止您通过 $container->get() 访问该服务。相反,您将需要使用依赖注入。
- 使用 YAML 格式配置您自己的服务。
- 使用注解来定义 Doctrine 实体的映射信息。
控制器
- 让你的控制器扩展 Symfony 提供的 AbstractController 基础控制器,并尽可能使用注解来配置路由、缓存和安全性。
- 不要将 Action 后缀添加到控制器操作的方法中。
- 不要使用@Template 注解来配置控制器使用的模板。- 不要使用 $this->get() 或 $this->container->get() 从容器中获取服务。相反,使用依赖注入。
- 使用 ParamConverter 技巧在简单方便时自动查询 Doctrine 实体。
模板
- 为您的模板使用 Twig 模板格式。
- 将应用程序模板存储在项目根目录下的 templates/ 目录中。
- 对目录和模板名称使用小写的snake_case。
- 对模板名称中的部分模板使用带前缀的下划线。
- 在 src/Twig/ 目录中定义你的 Twig 扩展。您的应用程序将自动检测并配置它们。
形式
- 将您的表单定义为 PHP 类。
- 将表单类型类放在 App\Form 命名空间中,除非您使用其他自定义表单类,如数据转换器。
- 在模板中添加按钮,而不是在表单类或控制器中。
- 不要在表单中定义验证约束,而是在表单映射到的对象上定义。
国际化
- 将翻译文件存储在项目根目录的 translations/ 目录中。
- 为您的翻译文件使用 XLIFF 格式。
- 始终使用键而不是内容字符串进行翻译。
安全
- 除非您有两个合法不同的身份验证系统和用户(例如,用于主站点的表单登录和仅用于您的 API 的令牌系统),否则我们建议仅启用一个启用匿名密钥的防火墙条目。
- 使用 bcrypt 编码器对用户密码进行哈希处理。
- 定义自定义安全投票器以实施细粒度限制。
网络资产
- 将资产存储在项目根目录的 assets/ 目录中。
- 使用 Webpack Encore 编译、组合和最小化 Web 资产。
测试
- 定义至少检查您的应用程序页面是否成功加载的功能测试。
- 硬编码功能测试中使用的 URL,而不是使用 URL 生成器。