【问题标题】:Monolith structure in bundle-less Symfony 4无捆绑 Symfony 4 中的单体结构
【发布时间】:2018-05-15 09:18:18
【问题描述】:

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

现在扩展:~300 个路由,~70 个控制器,~90 个实体,~20 个包

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

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

您会将 UserAuthenticationProvider 和/或 WebSocketServer 放在哪里?

【问题讨论】:

    标签: php symfony structure business-logic symfony4


    【解决方案1】:

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

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

    我沿着src/Service/{Something}/{Something}Manager.php 路径走下去,因为我认为那是正确的方法。随着项目的发展,我很遗憾,并将转移到src/{Something}/Service/{Something}Manager.php

    为什么?

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

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

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

    您会将 UserAuthenticationProvider 和/或 WebSocketServer 放在哪里?

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

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

    【讨论】:

      【解决方案2】:

      首先,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
      

      【讨论】:

      • 感谢您的详细解答。
      猜你喜欢
      • 2018-05-15
      • 2013-05-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2011-02-21
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多