Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony:覆盖来自其他捆绑包的条令实体_Php_Symfony_Orm_Doctrine - Fatal编程技术网

Php Symfony:覆盖来自其他捆绑包的条令实体

Php Symfony:覆盖来自其他捆绑包的条令实体,php,symfony,orm,doctrine,Php,Symfony,Orm,Doctrine,我正在编写一个Symfony应用程序,它将被多个客户使用。有些客户需要额外的功能,所以我的想法是,我将所有标准功能放在BundleA中,并将额外功能放在BundleB中,而BundleB仅为需要它的客户启用 我想在BundleB中做的一件事是,通过添加一个额外的字段来扩展BundleA中的一个实体 我的代码当前看起来像这样: 您有两个表定义。尝试删除实体中的表定义或使用其他表名 <?php // BundleA/Model/Element.php namespace BundleA\Mo

我正在编写一个Symfony应用程序,它将被多个客户使用。有些客户需要额外的功能,所以我的想法是,我将所有标准功能放在BundleA中,并将额外功能放在BundleB中,而BundleB仅为需要它的客户启用

我想在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;
}
您想要的是:


先解决一个问题。您有两个实体具有相同的
@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;
}