1

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

类继承,无论是通过特征(mixins)还是抽象类,似乎都不足以或至少是不正确的重用此功能的方法,因为它没有通过is-a测试。毕竟,实体有一个createddate,但它本身不是一个 createddate.. 所以我们应该使用组合而不是继承,对吗?但是,observer似乎在这里不起作用,因为虽然我想按需使用此功能,但在不使用Reflection的情况下,Doctrine 对注释和对象属性的使用似乎使水平注入变得困难(而且成本高昂?)。

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

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

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

1 回答 1

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
}
于 2012-04-18T17:33:19.100 回答