无捆绑 Symfony 4 中的单体结构

Monolith structure in bundle-less Symfony 4

我开始使用和测试 Symfony 4 进行主项目迁移。我习惯于被 Symfony 告知应该如何构建文件,但现在当没有更多的包时,我想知道如何构建巨大的单体应用程序。

立即扩展:~300 条路线、~70 个控制器、~90 个实体、~20 个包

services.yaml 应该是什么样子? - 我应该留在 App 命名空间还是我可以模拟捆绑包?每个组件的服务配置放在哪里?

服务和控制器应该如何在目录中分开? - 我应该选择 src/Service/{Something}/{Something}Manager.php 还是继续使用 src/{Something}/Service/{Something}Manager.php 并且不使用 Bundle关键词?为什么?

UserAuthenticationProvider and/or WebSocketServer 放在哪里?

首先,S4 仍然像以前一样支持捆绑包。配置部分已经进行了一些重组,但如果你已经有一个巨大的应用程序在捆绑包下工作,那么你可能只考虑或多或少地保持原样。它应该仍然可以正常工作,只需进行最少的调整。

无捆绑应用程序有几种方法。通常,您会使用功能子目录按功能对文件进行分组,以保持组织有序。

假设您有三个现有的包,分别称为 FooBundle、BarBundle、JarBundle

config
    services
        foo.yaml
        bar.yaml
        jar.yaml
    routes:
        foo.yaml
        bar.yaml
        jar.yaml
src
    Controller
        Foo
           Foo1Controller
           Foo2Controller
        Bar
           etc
    Entity
        Foo
            foo entities
        Bar
            bar entities
    Form
        etc
templates
    foo
    bar
    jar

你懂的。可能值得提前对这一切进行建模,特别是看看零碎可能适合的地方。并且可能对所有内容都使用 App 命名空间。这种方法几乎遵循了 Symfony 4 的最佳实践。真的不会错得太远。

至少还有一种方法可以按功能对文件进行分组。我不会详细介绍,因为它绝对不是正常的 Symfony 方法,并且需要进行一些调整。但你可以这样做:

src
    Blog
        routes.yaml
        services.yaml
        BlogEntity.php
        BlogVoter.php
        Edit
            BlogEditController.php
            BlogEditForm.php
            BlogEditTemplate.html.twig
            etc
        Show
            BlogShowController.php
            etc

我为遗留单体应用程序制作了一组新的 REST API,但遇到了同样的问题。

我先回答这个问题: 服务和控制器应该如何在目录中分开?

我走 src/Service/{Something}/{Something}Manager.php 路,因为我认为那是路。随着项目的发展,我对此感到遗憾,并将移至 src/{Something}/Service/{Something}Manager.php

为什么?

  1. 我发现命名空间中的分隔更容易阅读,也更容易 更难不小心 use 错误 class.
  2. 我现在将文件拆分到整个应用程序中,很难将其抽象为一个可供其他应用程序重复使用的库。
  3. 我无法轻松重构功能 - 一切都分散在一个 交织在一起。如果我要转换一个整体,我宁愿有 重构受某些函数约束的代码,以便我可以继续工作 那,在移动到下一个之前。

还有其他原因,但觉得有必要在应用程序变大之前将其分离出来。

services.yaml 应该是什么样子? 好吧,自动装配太棒了。我会将您的服务 yaml 保留在各种功能拆分中(如上所述)并开始重构它们。使用默认的自动装配配置,您会发现几乎不需要显式定义。

UserAuthenticationProvider and/or WebSocketServer 放在哪里?

对于提供商,可能类似于 src/Security/Authentication/Provider/UserAuthenticationProvider.php

对于 WS 服务器,我不太确定 - 这取决于它在应用程序中的位置以及它的使用方式。