我以前从未使用过symfony / doctrine,而且我正在努力做到这一点。我创建了ProjectBundle
和FeatureBundle
。
我在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
。
回顾一下:
ProjectItemInterface
是否过于通用,我应该将项目内容包含在我的ProjectItem
中并完成吗?ProjectBundle
中的CoreBundle
实施配置多态oneToMany
学说关系?ProjectItemInterface
答案 0 :(得分:0)
这是一个非常大的问题。我只想谈几点。
显然你对分离东西有很多了解。您不熟悉S2 / D2这一事实让我想建议您首先将Project和Feature捆绑在一起,直到您更熟悉其工作原理。我担心的是你开始时可能会花费太多精力。
话虽如此,请仔细阅读:http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html。
D2允许您通过可在CoreBundle中定义的界面将Project实体与Feature实体相关联。然后,您可以在运行时指定实际的Feature类。因此,您的项目永远不需要知道该功能的来源。它有一些限制,但可能足以满足您的目的。
第二种方法是完全避免D2关系。相反,当加载项目实体时,它会调度一个请求它的功能的事件。核心事件侦听器将拾取事件,导致查询并返回功能。这种方法完全隔离了两个捆绑包,但当然可以使更新等更加困难。
希望这至少可以为您提供一些尝试方向的提示。