假设我正在撰写博客应用:我的Posts
实体应该有createddate
,modifieddate
,name
和slug
属性(slug)当我为实体调用setName()时会生成。我想重用这段代码,但我也想重用它 on-demand 。例如,我可能有一个Log
实体想要使用createddate
,但不能使用modifieddate
或slug
功能。
类继承,无论是通过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');
}
答案 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
}