无束Symfony 4中的整体结构

时间:2018-05-15 09:18:18

标签: php symfony structure business-logic symfony4

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

现在缩放:~300条路线,~70个控制器,~90个实体,~20个捆绑

services.yaml应该如何? - 我应该继续使用App命名空间还是可以模拟捆绑包?在哪里为每个组件提供服务配置?

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

你会把UserAuthenticationProvider和/或WebSocketServer放在哪里?

2 个答案:

答案 0 :(得分:3)

我为遗留整体应用程序制作了一组新的REST API,并面临同样的问题。

我将首先回答这个问题: 如何在目录中分隔服务和控制器?

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

为什么?

  1. 我发现命名空间中的分离更容易阅读和更多 更难以意外地use错误的班级。
  2. 我现在已经在整个应用程序中拆分了文件,将其抽象到可以被其他应用程序重用的库中要困难得多。
  3. 我不能轻易地重构功能 - 一切都散布开来 交织在一起。如果我要转换一块巨石,我宁愿拥有 重构的代码,由某些函数绑定,所以我可以继续工作 那,在移动到下一个之前。
  4. 还有其他原因,但感觉需要在应用程序变大之前将其分开。

    services.yaml应该如何?嗯,自动装配是惊人的。我会保持你的服务yamls在各种功能分裂(如上所述)并开始重构它们。使用默认的自动装配配置,您会发现很少需要明确的定义。

    你会把UserAuthenticationProvider和/或WebSocketServer放在哪里?

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

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

答案 1 :(得分:1)

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