Symfony 3 前端和后端包之间的共享实体

Shared Entities between Frontend and Backend Bundles in Symfony 3

在典型的web应用中,根据Separation of concerns原则,作为frontend backend 部分,有几乎完整的不同

我决定我的 Symfony 网络应用程序有单独的 Bundles 用于 Frontend后端(以及API)。

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

我认为:

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

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

src
|---FrontendBundle
|---BackendBundle

各有利弊。但我不知道如何跨捆绑共享 Entities

我会使用第一个结构,但在同一个命名空间下, 喜欢:

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

此外,您为什么需要 frontendBundle 中的实体?我相信您可以通过 Entity Manager 从 ApiBundle 访问 backendBundle 的实体。

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

$em = $this->getDoctrine()->getManager();
$em->getRepository(Tasks::class)->findAll();

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

什么应该被视为捆绑包?

Symfony documentation 说:

  • 捆绑包类似于其他软件中的插件
  • Bundle 是 Symfony第一个class 公民
  • 您可以使用第三方捆绑包
  • 中打包的预建功能
  • 您可以分发您的自己的捆绑包
  • 您可以挑选并选择要在您的应用程序中启用的功能

There are two types 个捆绑包:

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

现在怎么办?

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

我的 Bundle 不会 可重复使用 ,它是 Application-specific , 所以它将驻留在 src 目录中。

没有必要将 BackendBundle 和 FrontendBundle 分开,因为它们紧密耦合。所以:

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

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

    \src\AppBundle\Form\Backend\UserType
    \src\AppBundle\Form\Frontend\UserType
    
  • EntitiesBackend & Frontend 之间共享因此位于:

    \src\AppBundle\Entity
    
  • 业务逻辑喜欢:

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

    居住地:

    \src\AppBundle\Model
    

此模式也可用于其他事情,例如 views & exceptions

src
|
└---AppBundle
    |
    |---Controller
    |   |
    |   |---Backend
    |   |   |
    |   |   └---UserController
    |   |
    |   └---Frontend
    |       |
    |       └---UserController
    |
    |---Entity
    |
    |---Form
    |   |
    |   └---Backend
    |   |   |
    |   |   └---UserType
    |   |
    |   └---Frontend
    |       |
    |       └---UserType
    |
    └---Model
        |
        |---Repository
        |
        └---Handler