1

在一个典型的 Web 应用程序中,根据关注点分离原则,作为前端后端部分,有几乎完整的一套不同的

  • 形式
  • 例外
  • 意见
  • 控制器

我决定我的 Symfony Web 应用程序为前端后端(以及稍后的API )提供单独的捆绑包。

问题在于Entity,因为它们可以共同使用。但我不知道如何合理地构建我的应用程序。

我想:

src
|---AppBundle
|---FrontendBundle
|---BackendBundle

src
|---AppBundle
    |---FrontendBundle
    |---BackendBundle

src
|---FrontendBundle
|---BackendBundle

每个都有一些优点和缺点。但我不知道如何在捆绑包中共享实体。

4

2 回答 2

2

在深入研究 Symfony Bundles和其他定义明确的概念和组件(如Symfony Components )几个月后,我发布了这个答案,以供有类似问题的人进一步参考这个问题:

什么应该被视为捆绑包?

Symfony 文档说:

  • 捆绑软件类似于其他软件中的插件
  • Bundles在 Symfony中是一等公民
  • 您可以使用打包在第三方捆绑包中的预构建功能
  • 您可以分发自己的捆绑包
  • 您可以选择在您的应用程序中启用哪些功能

有两种类型的捆绑包:

  • 特定于应用程序的捆绑包:仅用于构建您的应用程序(位于src目录中)
  • 可重用包:意味着在许多项目中共享。(驻留在vendor目录中)

现在要做什么?

所以,到目前为止,我设计我的应用程序结构是这样的:

我的Bundle不会是Reusable,它是Application-specific,所以它将驻留在src目录中。

不需要分开 BackendBundle 和 FrontendBundle,因为它们是紧耦合的。所以:

  • 我将只有 AppBundle (或为它选择的更好的名称)src
  • 为了分离后端前端功能,我使用命名空间

    \src\AppBundle\Controller\Backend\UserController
    \src\AppBundle\Controller\Frontend\UserController
    

    或者

    \src\AppBundle\Form\Backend\UserType
    \src\AppBundle\Form\Frontend\UserType
    
  • 实体在后端前端之间共享,因此驻留在:

    \src\AppBundle\Entity
    
  • 业务逻辑如:

    • 任何 DTO(数据传输对象)
    • 任何数据处理程序(操作模型数据)
    • 任何存储库类或类似类
    • 任何实用程序和助手类(帮助操作模型数据)
    • 任何与模型数据相关的接口

    住在:

    \src\AppBundle\Model
    

这种模式也可以用于其他事情,例如视图异常

src
|
└---AppBundle
    |
    |---Controller
    |   |
    |   |---Backend
    |   |   |
    |   |   └---UserController
    |   |
    |   └---Frontend
    |       |
    |       └---UserController
    |
    |---Entity
    |
    |---Form
    |   |
    |   └---Backend
    |   |   |
    |   |   └---UserType
    |   |
    |   └---Frontend
    |       |
    |       └---UserType
    |
    └---Model
        |
        |---Repository
        |
        └---Handler
于 2017-10-06T06:04:51.757 回答
1

我会使用第一个结构,但在相同的命名空间下,例如:

src
    |---App
         |---ApiBundle
         |---FrontendBundle
         |---BackendBundle

另外,为什么要在 frontendBundle 中使用实体?而且我相信您可以通过 Entity Manager 从 ApiBundle 访问 backendBundle 的实体。

您可以在每个捆绑包中使用它:

$em = $this->getDoctrine()->getManager();
$em->getRepository(Tasks::class)->findAll();
于 2017-03-08T11:24:46.857 回答