使用oneToMany组织symfony和Doctrine配置



我以前从未使用过symfony/doctrine,并且正在尝试正确地做到这一点。我创建了一个ProjectBundle和一个FeatureBundle.

我在ProjectBundleEntity目录中有以下接口和类:

Project.php (implements ProjectInterface)
ProjectInterface.php
ProjectItemInterface.php

在我的应用程序中,一个Project可以有很多Features但由于我试图完全分离关注点,因此ProjectBundle不需要了解FeatureBundle。我没有任何ProjectItemInterface的实现,因为我设想它有许多不同的实现。

我计划为我的应用程序提供一个将所有捆绑包组合在一起的CoreBundle。我试图像Sylius所做的那样分离关注点。

不过,我对应该如何在每个捆绑包中进行教义配置感到困惑。这是我在ProjectBundleProject.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但我将来可能需要向其添加一些其他实体类型,例如Tasks 或其他东西。

ProjectInterface定义了泛型::addItem(ProjectItemInterface $item)::getItems()方法。

这些方法在ProjectBundle中有意义,但在CoreBundle中没有意义。似乎我想要像::addFeature(FeatureInterface $task)::addTask(TaskInterface $task)这样的方法.这是一个令人困惑的领域。

另一个是Project.orm.yml文件在CoreBundle中的外观,因为我将扩展该基本实体Project并添加特定于应用程序的专有技术和方法。

我已经阅读了映射的超类,我相信我在扩展基本Project时会使用这些超类,但我不知道如何在CoreBundle中配置oneToManyProjectItemInterface关系。我已经读过一些关于鉴别器映射的信息,但我认为这是针对相互扩展的类的。我的ProjectItemInterface实现不会扩展基本ProjectItem

回顾一下:

  1. 我的捆绑/实体结构有意义吗?
  2. ProjectBundle是否太通用,我应该在我的CoreBundle中包含项目内容并完成它?
  3. 如果没有,如何在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关系的东西。 相反,当加载项目实体时,让它调度一个请求其功能的事件。 核心事件侦听器将选取事件,导致查询并返回特征。 这种方法完全隔离了两个捆绑包,但当然会使更新等更加困难。

希望这至少能给你一些关于尝试哪个方向的提示。

相关内容

  • 没有找到相关文章