我们正在编写基于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,但该部分尚未涵盖。搜索网络也没有提供解决方案。
我们正在使用注释方法来定义模型。
答案 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: ~