Symfony:实体和类实现

时间:2017-06-29 16:21:49

标签: php symfony doctrine

假设我想在我的数据库中有两个实体,一个Box和一个Object。我可以有不同的盒子,在每个盒子里我可以添加多个对象。 (为简单起见,我在代码示例中错过了getter,setter,$ id等)

框实体

namespace AppBundle\Entity;
class Box {
    ...
    /**
     * @ORM\OneToMany(targetEntity="Object", mappedby="box")
     */
    private $objects;
    }

对象实体

namespace AppBundle\Entity;
class Object {
    ...
    /**
     * @ORM\ManyToOne(targetEntity="Box", mappedby="objects")
     */
    private $box;

    // The following are assumptions
    private $objectType;
    private $objectData;
    private $theObject;
}

我的对象可以是多种类型(我希望能够在不触及数据库的情况下添加新类型的对象):

笔(非实体)

class Pen implements ObjectType {
    public $color; // In reality this would have set/get

    public function whatAmI() {
        return "I am a ".$this->color." pen";
    }
}

远程(非实体)

class Remote implements ObjectType {
    public $numberOfButtons;

    public function whatAmI() {
        return "I am a remote with ".$this->numberOfButtons." buttons";
    }

    public function pressButton() {
        ...
    }
}

对象类型

interface ObjectType {
    public function whatAmI();
}

我的问题是将两个位组合在一起的最佳方法是什么?我希望能够做到以下几点:

浏览我框中的所有对象并调用它们实现的功能:

$myBox = $em->find('Box', $id);

foreach ($myBox->getObjects() as $object) {
    echo $object->whatAmI();
}

创建一个新对象并将其添加到我的框中:

$myPen = new Pen();
$myPen->color = "red";

$myBox->addObject($myPen);

如果我直接从数据库中获取对象,则调用函数:

$myRemote = find('Object', $id); // $id will be of a Remote class
$myRemote->pressButton();

0 个答案:

没有答案