2012-04-13 6 views
2

Symfony2를 기반으로하는 사용자 정의 CMS를 작성 중이며 현재 사용자 시스템에서 작업 중입니다. 우리 번들은 사이트가 사용자 데이터를 위해 필요로 할 수있는 모든 가장 일반적인 속성을 포함하고 BaseSiteUser을 확장하고 엔터티에 대한 테이블을 정의하는 을 정의했습니다.Symfony2의 다른 번들에서 엔티티 덮어 쓰기

아이디어는 각각의 개별 프로젝트에 대해 SiteUser 엔티티를 새 프로젝트의 네임 스페이스에서보다 구체적인 것을 작성하여 덮어 쓰거나 새 프로젝트의 네임 스페이스를 지정하지 않으면 기본값을 사용한다는 아이디어가있었습니다.

우리의 번들 아키텍처는 다음과 같이 다소 같습니다

OurCompany 
    CMSBundle 
    Entities 
     BaseSiteUser.php 
     SiteUser.php 

CustomerName 
    CustomerProjectBundle 
    CMSBundle 
    Entities 
     SiteUser.php 

우리의 문제가 CustomerName\CMSBundle에 정의 된 SiteUser 대신 OurCompany\CMSBundle에서 하나의 사용되도록 우리가 모델을 구축 할 수 있다는 것입니다. 대신, 우리는이 오류를 얻을 : 우리는 documentation 컨설팅 시도

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

을하지만, 그 부분은 아직 적용되지 않았습니다. 웹 검색은 해결책도 제공하지 못했습니다.

우리는 모델을 정의하기 위해 주석 방법을 사용하고 있습니다.

답변

0

내가 이전의 대답을 잘못으로 삭제했습니다. :). 방금 FOSUserBundle의 구현을 확인했습니다. 그들은 inheritance mapping을 사용하고 있습니다. 따라서 CMSBundle 코어에 BaseSiteUser@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에 번들을 등록하는 것을 잊지 마십시오. 당신은 엔티티 매니저의 구성으로 CustomerNameCMSbundle를 추가 SiteUserCustom에 새로운 필드를 정의 할 수있게하려면 는 :

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