从Symfony2中的另一个包中覆盖实体

时间:2012-04-13 12:56:24

标签: php orm symfony doctrine

我们正在编写基于Symfony2的自定义CMS,目前正在开发用户系统。我们的bundle定义了一个BaseSiteUser,其中包含一个站点可能需要的所有最常用的属性,以及一个SiteUser,它扩展BaseSiteUser并为该实体定义一个表。 / p>

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

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

OurCompany
  CMSBundle
    Entities
      BaseSiteUser.php
      SiteUser.php

CustomerName
  CustomerProjectBundle
  CMSBundle
    Entities
      SiteUser.php

我们的问题是我们无法构建模型,因此使用SiteUser中定义的CustomerName\CMSBundle而不是OurCompany\CMSBundle中的 [Doctrine\DBAL\Schema\SchemaException] The table with name 'siteuser' already exists. 。相反,我们得到了这个错误:

{{1}}

我们尝试咨询documentation,但该部分尚未涵盖。搜索网络也没有提供解决方案。

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

2 个答案:

答案 0 :(得分:0)

我删除了我以前的答案,因为它错了:)。刚检查了FOSUserBundle的实施情况。他们正在使用inheritance mapping。因此,在您的核心CMSBundle中将BaseSiteUser定义为@MappedSuperclass,并在您重写的捆绑包中展开BaseSiteUser

答案 1 :(得分:0)

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

OurCompany   
  CMSBundle
    Entities

      /**
      * BaseSiteUser
      *
      * @ORM\Entity(repositoryClass="OurCompany\CMSBundle\Repository\SiteUserRepository")
      * @ORM\Table(name="siteuser")
      * @ORM\InheritanceType("SINGLE_TABLE")
      * @ORM\DiscriminatorColumn(name="discr", type="string")
      *
      * DON'T USE EXPLICIT DISCRIMINATOR MAP (it will be generated automatically) !!!
      * @ ORM\DiscriminatorMap({"basesiteuser" = "BaseSiteUser", "siteuser" = "SiteUser"})
      */
      BaseSiteUser.php

      /**
      * SiteUser
      *
      * @ORM\Table(name="siteuser")
      */
      SiteUser.php  => class SiteUser extends CustomerName\CMSBundle\Entities\SiteUserCustom

CustomerName   
  CustomerProjectBundle   
  CMSBundle
    Entities
      /**
      * SiteUserCustom
      *
      * @ORM\Table(name="siteuser")
      */
      SiteUserCustom.php => class SiteUserCustom extends OurCompany\CMSBundle\Entities\BaseSiteUser

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

orm:
  entity_managers:
    default:
      mappings:
        OurCompanyCMSbundle: ~
        CustomerNameCMSbundle: ~