我有2个具有相同字段的实体 - 父,子,订单。实际上它是一种机制,这3个字段不适用于该实体的内容 - 如名称,标题,类别等。
我想将这些字段设置为一个地方,一个类,我正在考虑我应该把它放在哪里。它应该是一个抽象类吗?或者我应该做一个特质?
我也可以使用 ORM \ Discriminator 机制,但我认为这是针对其他事情的,而不是我想做的事情。
答案 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
{
答案 1 :(得分:2)
前段时间我有这个问题。我也希望对实体(或值对象,无论如何)有一个很好的抽象,只是为了有点懒。但这不是恕我直言的好方法。
如果一个实体的名称必须有另一个实体的长度,该怎么办?如果您想要添加新字段,将其添加到一个实体,以及稍后您想要在另一个实体中,但是您忘记将其移至抽象,该怎么办?
我认为实体是一种自主的东西,将它的某些部分移到抽象中是毫无意义和困惑的。
请记住KISS原则。