使用学说扩展基类,我的基类是不是有 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 关联的主要内容,如果未能解决你的问题,请参考以下文章

确定子类是不是具有在 Python 中实现的基类方法

为啥我不能从扩展类型的基类调用扩展方法?

不是抽象类的基类不是好基类

我应该为我的基类使用实体框架上的啥继承策略?

用子类填充的基类向量不起作用

用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常是不是有原因?