【问题标题】: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 上有任何捆绑包这样做,我很想看看它们)。

【问题讨论】:

    标签: inheritance orm symfony doctrine-orm


    【解决方案1】:

    我遇到了类似的情况,我使用的解决方法是提供一个具体的基类,它被简单地视为抽象的(即:基类永远不会在任何地方实例化)。

    如果您想强制基类的“抽象性”(这样其他开发人员就不会愚蠢地尝试实例化一个),您可以在其构造函数中抛出异常。

    【讨论】:

    • 我使用这种方法遇到的问题是,如果我创建具体的基类,然后我尝试使用控制台更新我的数据库模式(doctrine:schema:update -- force),它抱怨缺少实体元数据映射文件(当然是这样,因为我不希望系统将该实体视为我系统中的域对象)。这可能是 symfony 独有的,但我的解决方法是在更新我的架构时注释掉这些文件的扩展名(非常烦人)。我觉得我错过了一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多