使用学说扩展基类,我的基类是不是有 1:n 关联
Posted
技术标签:
【中文标题】使用学说扩展基类,我的基类是不是有 1:n 关联【英文标题】:Extending a base class using doctrine, were my base class has 1:n associations使用学说扩展基类,我的基类是否有 1:n 关联 【发布时间】:2012-02-15 12:54:36 【问题描述】:我正在努力弄清楚如何在 Symfony 中实现两个包之间的正确分离,但我遇到了一个教义问题。
我有两个捆绑包,一个更通用的捆绑包(包含抽象类)称为“BaseProduct”,然后是该捆绑包的一个实现(提供了专门化该捆绑包功能的机会)称为“ClientProduct”。
我在“产品”包中有两个关联的实体。
abstract class Product
// One product has many attributes
private $attributes;
private function getAttributes()
return $this->attributes;
abstract class Attribute
private $name;
private $value;
private function getName()
return $this->name;
private function getValue()
return $this->value;
然后是具体的实现
class Product extends BaseProduct/Product
class Attribute extends BaseProduct/Attribute
我的问题
首先,我会使用“mappedSuperclass”来执行此操作,但是通过阅读文档,您无法将集合设置为非具体类的关联(可以理解)。
我正在尝试另一种方法来做到这一点。
这甚至可能吗?因为我的“基类”与另一个“基类”(都是抽象的)有关系。在那种情况下,我是否需要将关系转移到“具体”实现中,还是可以将它们保持在这个级别(抽象)?我的实体定义('.yml')没有显示,但我打算将它们链接到具体实现(实体之间的关联也在其他具体实现之间),并保留没有实体定义的基类。
欢迎任何输入 - 这里的目标是创建一个可以专门化的解耦包。我确信这是一个非常普遍的目标,所以我很想看看其他人是如何做到的(如果 github 上有任何捆绑包这样做,我很想看看它们)。
【问题讨论】:
【参考方案1】:我遇到了类似的情况,我使用的解决方法是提供一个具体的基类,它被简单地视为抽象的(即:基类永远不会在任何地方实例化)。
如果您想强制基类的“抽象性”(这样其他开发人员就不会愚蠢地尝试实例化一个),您可以在其构造函数中抛出异常。
【讨论】:
我使用这种方法遇到的问题是,如果我创建具体的基类,然后我尝试使用控制台更新我的数据库模式(doctrine:schema:update -- force),它抱怨缺少实体元数据映射文件(当然是这样,因为我不希望系统将该实体视为我系统中的域对象)。这可能是 symfony 独有的,但我的解决方法是在更新我的架构时注释掉这些文件的扩展名(非常烦人)。我觉得我错过了一些东西。以上是关于使用学说扩展基类,我的基类是不是有 1:n 关联的主要内容,如果未能解决你的问题,请参考以下文章