0

我有 2 个 Symfony 包。AdminBundle 将始终安装。可能会或可能不会安装 PageBundle。

我想定义一个名为 AdminModule 的基本实体(名称、控制器类、描述、启用),以及一个简单地从 AdminModule 继承的 PageModule(实体控制器将实现特定的接口)。

<?php

namespace AdminBundle\Entity;

/**
 * Admin Component
 *
 * @ORM\Entity
 * @ORM\Table(name="admin_module")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"page" = "\PageBundle\Entity\PageComponent"})
 */
class AdminModule
{
    // private vars, getters, setters
}
?>

<?php
namespace PageBundle\Entity;

use AdminBundle\Entity\AdminModule;

/**
 * Page Component
 *
 * @ORM\Entity
 * @ORM\Table(name="page_module")
 */
class PageModule extends AdminModule
{
    //
}
?>

我认为,我遇到的问题是 AdminModule 注释@ORM\DiscriminatorMap({"page" = "\PageBundle\Entity\PageModule"})需要在 AdminBundle 上定义 - 但可能没有安装 PageBundle。

我相信必须有错误类型的继承结构(?)但是我不清楚我可以采取哪些替代方法?感谢您的任何帮助或指导:)

4

1 回答 1

0

你不能用表继承映射做你想做的事情,因为你必须在父类中编写注释,所以父类本身最终会与他的孩子耦合。

您可以使用映射的超类(@MappedSuperclass)来扩展实际的父实体。

然后,您所有的公共属性都应该进入映射的超类,使用其子类作为实际实体来定义不同的继承映射和关联(映射超类中的关联映射非常有限)。

所以在你的具体情况下,你可以有这样的结构:

/** 
 * I'm not an actual Entity!
 *
 * @MappedSuperClass */
Class ModuleSuperClass {}


/** 
 * I don't have children
 * 
 * @ORM\Entity */
Class BaseModule extends ModuleSuperClass {}

/** 
 * I have children
 * 
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"page" = "Page"}) 
 */
Class AdminModule extends ModuleSuperClass {}

/**
 * I'm just a child
 *
 * @ORM\Entity
 */
Class PageModule extends AdminModule {}

您的里程当然可能会有所不同,即我宁愿有一个没有孩子的 BaseModule 类,然后是一个完全不同的命名空间中的 BaseModule 来扩展 AdminModule 和 PageModule。

于 2013-05-15T11:00:45.000 回答