Symfony2 - 扩展实体,抽象实体

时间:2015-11-18 14:16:02

标签: php symfony

我有2个具有相同字段的实体 - 父,子,订单。实际上它是一种机制,这3个字段不适用于该实体的内容 - 如名称,标题,类别等。

我想将这些字段设置为一个地方,一个类,我正在考虑我应该把它放在哪里。它应该是一个抽象类吗?或者我应该做一个特质?

我也可以使用 ORM \ Discriminator 机制,但我认为这是针对其他事情的,而不是我想做的事情。

2 个答案:

答案 0 :(得分:5)

我将使用doctrines @MappedSuperClass注释和共享字段创建一个抽象类,并且实体扩展它们

这是一个共享created_at字段的示例

namespace Your\CoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\MappedSuperclass;



/**
 * Abstract base class to be extended by my entity classes with same fields
 *
 * @MappedSuperclass
 */
abstract class AbstractEntity {

    /**
     * @var integer
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $createdAt;


    /**
     * Get id
     * @return integer
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Get createdAt
     * @return \DateTime
     */
    public function getCreatedAt() {
        return $this->createdAt;
    }

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     *
     * @return AbstractEntity
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

} 

你的实体都扩展了这个类,如:

class YourEntityClass extends AbstractEntity
{
在YourEntityClass中,$ id属性必须为“protected”

答案 1 :(得分:2)

前段时间我有这个问题。我也希望对实体(或值对象,无论如何)有一个很好的抽象,只是为了有点懒。但这不是恕我直言的好方法。

如果一个实体的名称必须有另一个实体的长度,该怎么办?如果您想要添加新字段,将其添加到一个实体,以及稍后您想要在另一个实体中,但是您忘记将其移至抽象,该怎么办?

我认为实体是一种自主的东西,将它的某些部分移到抽象中是毫无意义和困惑的。

请记住KISS原则。