使用oneToMany组织symfony和doctrine配置

时间:2014-03-07 04:20:49

标签: symfony doctrine-orm

我以前从未使用过symfony / doctrine,而且我正在努力做到这一点。我创建了ProjectBundleFeatureBundle

我在ProjectBundle的{​​{1}}目录中有以下接口和类:

Entity

在我的应用中,Project.php (implements ProjectInterface) ProjectInterface.php ProjectItemInterface.php 可以有多个Project,但由于我试图完全区分问题,Features无需了解ProjectBundle }。我没有FeatureBundle的任何实现,因为我设想它有许多不同的实现。

我计划为我的应用提供一个ProjectItemInterface,将所有捆绑在一起。我试图将Sylius正在做的事情分开。

我对如何在每个包中进行学说配置感到困惑。以下是CoreBundle

Project.orm.yml的内容
ProjectBundle

我很困惑,因为Acme\Bundle\ProjectBundle\Entity\Project: type: mappedSuperclass id: id: type: integer generator: strategy: AUTO fields: name: type: string length: 255 createdAt: type: datetime gedmo: timestampable: on: create updatedAt: type: datetime gedmo: timestampable: on: update nullable: true oneToMany: items: targetEntity: Acme\Bundle\ProjectBundle\Entity\ProjectItemInterface mappedBy: project orphan-removal: true cascade: - all 是多态的。在我的应用程序的情况下,它需要是ProjectItemInterface,但我可能需要在将来添加一些其他实体类型,如Feature s或其他东西。

Task定义了通用的ProjectInterface::addItem(ProjectItemInterface $item)方法。

这些方法在::getItems()中有意义,但在ProjectBundle中却没有。似乎我想要CoreBundle::addFeature(FeatureInterface $task)等方法。这是一个混乱的领域。

另一个是::addTask(TaskInterface $task)文件应该在Project.orm.yml中的样子,因为我将扩展该基础CoreBundle实体,并添加特定应用的专业知识和方法。

我已经阅读了mapped superclasses,我相信我会在扩展基础Project时使用,但我不知道如何配置Project {{1} oneToMany中的关系。我已经阅读了一些关于鉴别器贴图的内容,但我认为这些是相互扩展的类。我的ProjectItemInterface实施不会扩展基础CoreBundle

回顾一下:

  1. 我的捆绑/实体结构是否有意义?
  2. 我的ProjectItemInterface是否过于通用,我应该将项目内容包含在我的ProjectItem中并完成吗?
  3. 如果没有,我如何为ProjectBundle中的CoreBundle实施配置多态oneToMany学说关系?
  4. ProjectItemInterface

1 个答案:

答案 0 :(得分:0)

这是一个非常大的问题。我只想谈几点。

显然你对分离东西有很多了解。您不熟悉S2 / D2这一事实让我想建议您首先将Project和Feature捆绑在一起,直到您更熟悉其工作原理。我担心的是你开始时可能会花费太多精力。

话虽如此,请仔细阅读:http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html

D2允许您通过可在CoreBundle中定义的界面将Project实体与Feature实体相关联。然后,您可以在运行时指定实际的Feature类。因此,您的项目永远不需要知道该功能的来源。它有一些限制,但可能足以满足您的目的。

第二种方法是完全避免D2关系。相反,当加载项目实体时,它会调度一个请求它的功能的事件。核心事件侦听器将拾取事件,导致查询并返回功能。这种方法完全隔离了两个捆绑包,但当然可以使更新等更加困难。

希望这至少可以为您提供一些尝试方向的提示。