Php Symfony:覆盖来自其他捆绑包的条令实体
我正在编写一个Symfony应用程序,它将被多个客户使用。有些客户需要额外的功能,所以我的想法是,我将所有标准功能放在BundleA中,并将额外功能放在BundleB中,而BundleB仅为需要它的客户启用 我想在BundleB中做的一件事是,通过添加一个额外的字段来扩展BundleA中的一个实体 我的代码当前看起来像这样:Php Symfony:覆盖来自其他捆绑包的条令实体,php,symfony,orm,doctrine,Php,Symfony,Orm,Doctrine,我正在编写一个Symfony应用程序,它将被多个客户使用。有些客户需要额外的功能,所以我的想法是,我将所有标准功能放在BundleA中,并将额外功能放在BundleB中,而BundleB仅为需要它的客户启用 我想在BundleB中做的一件事是,通过添加一个额外的字段来扩展BundleA中的一个实体 我的代码当前看起来像这样: 您有两个表定义。尝试删除实体中的表定义或使用其他表名 <?php // BundleA/Model/Element.php namespace BundleA\Mo
您有两个表定义。尝试删除实体中的表定义或使用其他表名
<?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;
}
您想要的是:
先解决一个问题。您有两个实体具有相同的@ORM\Table(name=“Element”)
我知道。我希望两者具有相同的表名,因为它们中只有一个应该处于活动状态。它应该配置为使用BundleA或BundleB中的元素,而不能同时使用这两种元素。所以我想要一个配置选项,比如“bundle.element\u class”,它定义了应该使用哪个类作为实体。Doctrine2配置允许您指定要映射的目录。默认情况下,如果打开自动映射,捆绑包将自动映射。这意味着您可以告诉它忽略一个目录而使用另一个目录。我更喜欢使用一个表(元素),因为根据激活的捆绑包,只能使用其中一个。因此,如果BundleB被激活,则不应使用BundleA中的元素。
<?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;
}
<?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;
}
<?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;
}