2014-09-09 5 views
1

여러 고객이 사용할 Symfony 애플리케이션을 작성 중입니다. 일부 고객에게는 추가 기능이 필요하기 때문에 BUNDLEA에 모든 표준 기능을 넣고 BundleB에 추가 기능을 추가해야합니다. BundleB는 필요로하는 고객에게만 사용 가능합니다.Symfony : 다른 번들의 교리 객체 덮어 쓰기

내가 BundleB에서하고 싶은 일 중 하나는 BundleA에서 엔티티를 확장하여 추가 필드를 추가하는 것입니다. 나는 위의 코드에 대한 SQL 덤프하려고하면

<?php 
// BundleA/Model/Element.php 

namespace BundleA\Model; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Element 
{ 
    // All shared fields defined here 
} 

<?php 
// BundleA/Entity/Element.php 
namespace BundleA\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Table(name="Element") 
* @ORM\Entity 
*/ 
class Element extends AbstractElement 
{ 
} 


<?php 
// BundleB/Entity/BundleBElement.php 
namespace BundleB\Entity\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="Element") 
*/ 
class BundleBElement extends AbstractElement 
{ 
    /** 
    * @ORM\Column(name="mypage_id", type="integer") 
    */ 
    protected $mypageId; 
} 

, 나는 다음과 같은 얻을 :

표 이름의 '요소'이미

내 코드는 현재 다음과 같이 보입니다 존재합니다.

기본적으로 필자는 생각하기에 엔티티에 사용할 Element 클래스를 구성 할 수있는 일종의 구성 옵션이라고 생각합니다. 다음과 같이 설정하십시오 :

bundle: 
    element_class: BundleB\Entity\BundleBElement 

그러나이 설정 옵션을 구현하는 방법은 확실하지 않습니다.

모든 고객에게는 자체 데이터베이스가 있으므로 충돌하는 엔티티의 문제가 있어서는 안됩니다.

+0

먼저 한 가지 문제를 해결하십시오. 두 개의 엔티티가 동일한 @ORM \ Table (name = "Element")' – Flosculus

+0

을 가지고 있습니다. 둘 중 하나만 활성화해야하므로 같은 테이블 이름을 사용하고 싶습니다. BundleA 또는 BundleB의 Element를 사용하도록 구성되어야하며 둘 다에서 구성되지 않아야합니다. 그래서 어떤 클래스가 엔티티로 사용되어야하는지 정의하는 "bundle.element_class"와 같은 config 옵션이 필요합니다. – nifty

+0

간단하지 않습니다. Doctrine2 설정을 사용하면 매핑 할 디렉토리를 지정할 수 있습니다. 번들은 기본적으로 자동 매핑이 켜져 있으면 자동으로 매핑됩니다. 즉, 하나의 디렉토리를 무시하고 다른 디렉토리를 사용하도록 지시 할 수 있습니다. – Flosculus

답변

1

두 개의이 있습니다. 엔티티에서 테이블 정의를 삭제하거나 다른 테이블 이름을 사용하십시오.

<?php 
// BundleA/Model/Element.php 

namespace BundleA\Model; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Element 
{ 
    // All shared fields defined here 
} 

<?php 
// BundleA/Entity/Element.php 
namespace BundleA\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

class Element extends AbstractElement 
{ 
} 


<?php 
// BundleB/Entity/BundleBElement.php 
namespace BundleB\Entity\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="Element") 
*/ 
class BundleBElement extends AbstractElement 
{ 
    /** 
    * @ORM\Column(name="mypage_id", type="integer") 
    */ 
    protected $mypageId; 
} 
+0

활성화 된 번들에 따라 하나의 테이블 (요소) 만 사용해야하므로 단일 테이블 (요소)을 사용하는 것이 좋습니다. 따라서 BundleB가 활성화되면 BundleA의 Element는 사용되지 않아야합니다 *. – nifty

0

은 당신이 원하는 것은 single table inheritance입니다 : 당신이 그것을 확장 싶어 경우에만 확장 된 데이터 하나 테이블이 때문에

<?php 
// BundleA/Model/Element.php 

namespace BundleA\Model; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Element 
{ 
    // All shared fields defined here 
} 

<?php 
// BundleA/Entity/Element.php 
namespace BundleA\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Table(name="Element") 
* @ORM\Entity 
*/ 
class Element extends AbstractElement 
{ 
} 


<?php 
// BundleB/Entity/BundleBElement.php 
namespace BundleB\Entity\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="ElementB") 
*/ 
class BundleBElement extends AbstractElement 
{ 
    /** 
    * @ORM\Column(name="mypage_id", type="integer") 
    */ 
    protected $mypageId; 
} 

, 당신은 당신의 엔티티 A의 테이블 정의를 삭제 될 수 있습니다

<?php 
// BundleA/Model/Element.php 

namespace BundleA\Model; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
* @ORM\DiscriminatorMap({"a"="Element", "b"="BundleBElement"}) 
*/ 
abstract class Element 
{ 
    // All shared fields defined here 
} 

<?php 

namespace BundleA\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Element extends AbstractElement 
{ 
} 


<?php 

namespace BundleB\Entity\Entity; 

use BundleA\Model\Element as AbstractElement; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class BundleBElement extends AbstractElement 
{ 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $mypageId; 
} 

@Table 주석이 삭제되었습니다. (실제로 대부분의 유스 케이스에서는 불필요합니다. 사람들이 항상 추가하는 이유는 모르겠습니다.)

관련 문제