我以前从未使用过symfony/doctrine,并且正在尝试正确地做到这一点。我创建了一个ProjectBundle
和一个FeatureBundle
.
我在ProjectBundle
的Entity
目录中有以下接口和类:
Project.php (implements ProjectInterface)
ProjectInterface.php
ProjectItemInterface.php
在我的应用程序中,一个Project
可以有很多Features
但由于我试图完全分离关注点,因此ProjectBundle
不需要了解FeatureBundle
。我没有任何ProjectItemInterface
的实现,因为我设想它有许多不同的实现。
我计划为我的应用程序提供一个将所有捆绑包组合在一起的CoreBundle
。我试图像Sylius所做的那样分离关注点。
不过,我对应该如何在每个捆绑包中进行教义配置感到困惑。这是我在ProjectBundle
中Project.orm.yml
的内容
AcmeBundleProjectBundleEntityProject:
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: AcmeBundleProjectBundleEntityProjectItemInterface
mappedBy: project
orphan-removal: true
cascade:
- all
我很困惑,因为ProjectItemInterface
是多态的。在我的应用程序的情况下,它需要是一个Feature
但我将来可能需要向其添加一些其他实体类型,例如Task
s 或其他东西。
ProjectInterface
定义了泛型::addItem(ProjectItemInterface $item)
和::getItems()
方法。
这些方法在ProjectBundle
中有意义,但在CoreBundle
中没有意义。似乎我想要像::addFeature(FeatureInterface $task)
和::addTask(TaskInterface $task)
这样的方法.这是一个令人困惑的领域。
另一个是Project.orm.yml
文件在CoreBundle
中的外观,因为我将扩展该基本实体Project
并添加特定于应用程序的专有技术和方法。
我已经阅读了映射的超类,我相信我在扩展基本Project
时会使用这些超类,但我不知道如何在CoreBundle
中配置oneToMany
ProjectItemInterface
关系。我已经读过一些关于鉴别器映射的信息,但我认为这是针对相互扩展的类的。我的ProjectItemInterface
实现不会扩展基本ProjectItem
。
回顾一下:
- 我的捆绑/实体结构有意义吗?
- 我
ProjectBundle
是否太通用,我应该在我的CoreBundle
中包含项目内容并完成它? - 如果没有,如何在
Project
中为我的ProjectItemInterface
实现配置多态oneToMany
学说关系?
/CoreBundle
/Entity
Project.php (extends ProjectBundle's Project)
ProjectInterface.php (extends ProjectBundle's ProjectInterface)
Feature.php (extends FeatureBundle's Feature)
FeatureInterface.php (extends FeatureBundle's FeatureInterface and ProjectBundle's ProjectItemInterface)
/Resources
/config
/doctrine
Project.orm.yml (don't know what this should look like)
Feature.orm.yml
/ProjectBundle
/Entity
Project.php
ProjectInterface.php
ProjectItemInterface.php
/Resources
/config
/doctrine
Project.orm.yml
/FeatureBundle
/Entity
Feature.php
FeatureInterface.php
/Resources
/config
/doctrine
Feature.orm.yml
这是一个相当大的问题。 我只想谈几点。
显然,您对分离东西了解很多。 您是 S2/D2 的新手这一事实使我想建议您从耦合项目和功能包开始,直到您更加熟悉工作原理。 我担心的是,您可能会在刚开始时花费太多精力。
话虽如此,请通读这里:http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html。
D2 允许您通过可在 CoreBundle 中定义的接口将项目实体与功能实体相关联。 然后,可以在运行时指定实际要素类。 因此,您的项目永远不需要知道功能的来源。 它有一些限制,但可能足以满足您的目的。
第二种方法是完全避免D2关系的东西。 相反,当加载项目实体时,让它调度一个请求其功能的事件。 核心事件侦听器将选取事件,导致查询并返回特征。 这种方法完全隔离了两个捆绑包,但当然会使更新等更加困难。
希望这至少能给你一些关于尝试哪个方向的提示。