覆盖 Symfony2 中另一个捆绑包中的实体


Overwriting entities from another bundle in Symfony2

我们正在编写一个基于Symfony2的自定义CMS,目前正在用户系统上工作。我们的捆绑包定义了一个BaseSiteUser,其中包含站点的用户数据可能需要的所有最常见属性,以及一个扩展BaseSiteUser并为实体定义表的SiteUser

这个想法是,对于每个单独的项目,我们将通过在新项目的命名空间中创建一个更具体的实体来覆盖SiteUser实体,或者如果我们不指定新实体,则使用默认实体。

我们的捆绑架构看起来有点像这样:

OurCompany
  CMSBundle
    Entities
      BaseSiteUser.php
      SiteUser.php
CustomerName
  CustomerProjectBundle
  CMSBundle
    Entities
      SiteUser.php

我们的问题是我们无法构建模型,以便使用CustomerName'CMSBundle中定义的SiteUser而不是OurCompany'CMSBundle中定义的模型。相反,我们得到这个错误:

  [Doctrine'DBAL'Schema'SchemaException]
  The table with name 'siteuser' already exists.

我们尝试查阅文档,但该部分尚未涵盖。搜索网络也没有提供解决方案。

我们使用注释方法来定义模型。

我已经删除了我之前的答案,因为它:)错误。刚刚检查了FOSUserBundle的实施。他们正在使用继承映射。因此,在您的核心CMSBundle中将BaseSiteUser定义为@MappedSuperclass,并在覆盖的捆绑包中扩展BaseSiteUser

我认为这个解决方案应该有效(伪代码):

我们公司    招商证券    实体     /**      * 基本站点用户      *      * @ORM''Entity(repositoryClass="OurCompany''CMSBundle''Repository''SiteUserRepository")      * @ORM''Table(name="siteuser")      * @ORM''InheritanceType("SINGLE_TABLE")      * @ORM''DiscriminatorColumn(name="discr", type="string")      *      * 不要使用明确的鉴别器映射(它将自动生成)!!      * @ ORM''DiscriminatorMap({"basesiteuser" = "BaseSiteUser", "siteuser" = "SiteUser"})      */     基本站点用户.php     /**      * 网站用户      *      * @ORM''Table(name="siteuser")      */     SiteUser.php => 类 SiteUser 扩展 CustomerName''CMSBundle''Entities''SiteUserCustom客户名称    客户项目捆绑包    招商证券    实体     /**      * 网站用户自定义      *      * @ORM''Table(name="siteuser")      */     SiteUserCustom.php =>类 SiteUserCustom 扩展 OurCompany''CMSBundle''Entities''BaseSiteUser

不要忘记在 AppKernel.php 中注册您的捆绑包。如果您希望能够在 SiteUserCustom 中定义新字段,请将您的 CustomerNameCMSbundle 添加到实体管理器配置中:

或:  entity_managers:    违约:      映射:        我们的公司CMS捆绑包: ~        客户名称CMS捆绑包: ~