如何在Doctrine 2实体中重用列和事件?

时间:2012-04-18 00:32:24

标签: php oop doctrine-orm observer-pattern composition

假设我正在撰写博客应用:我的Posts实体应该有createddatemodifieddatenameslug属性(slug)当我为实体调用setName()时会生成。我想重用这段代码,但我也想重用它 on-demand 。例如,我可能有一个Log实体想要使用createddate,但不能使用modifieddateslug功能。

类继承,无论是通过traits(mixins)还是抽象类,似乎是重用此功能的不充分或至少是不正确的方法,因为它没有通过 is-a 测试。毕竟,实体有一个 createddate,但它本身不是一个创建日期..所以我们应该使用Composition而不是Inheritance,对吧?但是,observer似乎不适用于此,因为虽然我想使用此功能按需,但是Doctrine对注释和对象属性的使用似乎使得水平注入变得困难(并且昂贵) ?)不使用Reflection

要显示一些代码并简化问题:我是否可以立即将以下定义和功能注入实体而不会破坏DRY或良好的OOP(正确使用组合/继承)实践?

/**
 * @var DateTime $createddate
 *
 * @ORM\Column(type="datetime")
 */
private $createddate;

/**
  * @ORM\PrePersist
  */
public function createddatePrePersist() {
    $this->createddate = new \DateTime('now');
}

1 个答案:

答案 0 :(得分:4)

我个人的意见是,你正试图为你的锤子找到钉子。您没有拥有来为每个实体使用组合,继承,特征或任何OOP模式。

我倾向于认为creationDate是我的实体的固有属性,任何需要创建日期的实体都具有此属性。有人可能会说这是在重复自己,但在我看来,这使整个实体更容易阅读。

哦,如果可以的话,我不会使用特定于ORM的方法(不是我的域模型的一部分)来初始化创建日期。这将在我的构造函数中完成:

/**
 * @var DateTime $createddate
 *
 * @ORM\Column(type="datetime")
 */
private $createddate;

public function __construct()
{
    $this->createddate = new \DateTime();
    // ... and other business rules that need to be enforced in the constructor
}