2012-04-13 3 views
2

Symfony2をベースにしたカスタムCMSを作成しており、現在はユーザシステム上で作業しています。私たちのバンドルでは、サイトがユーザーデータに必要とする最も一般的なすべてのプロパティと、BaseSiteUserを拡張し、エンティティのテーブルを定義するSiteUserを含むBaseSiteUserが定義されています。Symfony2の別のバンドルのエンティティを上書きする

新しいプロジェクトの名前空間でより具体的なものを作成してSiteUserエンティティを上書きするか、新しいプロジェクトの名前空間を指定しない場合はデフォルトのものを使用するという考えがありました。

当社のバンドル・アーキテクチャでは、多少のようになります。

OurCompany 
    CMSBundle 
    Entities 
     BaseSiteUser.php 
     SiteUser.php 

CustomerName 
    CustomerProjectBundle 
    CMSBundle 
    Entities 
     SiteUser.php 

私たちの問題はCustomerName\CMSBundleで定義されたSiteUserOurCompany\CMSBundleに代わり一つで使用されているように、私たちはモデルを構築することができないということです。代わりに、我々はこのエラーを取得:

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

は、我々はdocumentationに相談しようとしたが、その部分は、まだカバーされていません。 Webを検索しても解決策はありませんでした。

モデルを定義するために注釈方法を使用しています。

答えて

0

以前の回答を間違って削除しました。:)ちょうどFOSUserBundleの実装をチェックしました。彼らはinheritance mappingを使用しています。したがって、あなたのコアのCMSBundleBaseSiteUser@MappedSuperclassと定義し、オーバーライドされたバンドル内ではBaseSiteUserを拡張するだけです。

+0

おかげで、それが私たちのバンドルは、現在設定されている方法です。継承自体は正常に動作しますが、エンティティをオーバーライドすることは、私たちが苦労していることです。 – Kaivosukeltaja

+0

'OurCompany \ CMSBundle \ SiteUser'エンティティを抽象クラスとして設定することができます。 –

+0

しかし、デフォルトのエンティティを取得する場合は、各バンドルに空の 'SiteUser'エンティティを作成する必要があります。 –

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: ~ 
関連する問題