我经常在模型中使用辅助方法。例如,如果我的模型有'date'属性,我可能有getDateShort()或getDateLong()方法。可以将这些方法放在我的实体中,还是应该围绕实体包装模型类并将实体视为模型资源?
答案 0 :(得分:2)
这是一个非常广泛的问题。
通常,直接向实体添加这些方法没有任何问题。一个好的经验法则是,如果这些方法只涉及实体内部的数据,那么这些方法就没问题了。
也就是说,对格式化日期这样的事情可能会更好地放入一些外部助手类中,因为您可能希望在几个不同实体类的日期上进行一致的格式化。
使用您的日期示例,您可能会考虑实现一个可以使用可选参数的getter,您可以这样使用:
<?php
$myEntity = $em->find('MyEntity',1);
echo $myEntity->getCreatedAt(MY_DATE_FORMAT_SHORT);
在该示例中,我们假设有一些全局定义的MY_DATE_FORMAT_ *常量。对于更具体到此实体类型的东西,您可以改为定义类常量。
回到你的问题,这是另一个我认为在实体内完全可以做的事情的例子:
<?php
/**
* @Entity
*/
class Order
// ...
/**
* @OneToMany(targetEntity="OrderLine")
*/
protected $lines = array();
// ...
public function getTotal(){
$sum = 0;
foreach($this->lines as $l) $sum += $l->getTotal();
$sum += $this->computeTax();
$sum += $this->applyCoupons();
return $sum;
}
}
因此,内部(直接或通过关联)数据的各个位用于计算订单总数。但由于它只是 内部可见数据,因此将getTotal()作为Order上的方法包含在内是很有意义的。
另一方面,如果您正在向某些送货服务进行API调用,以便在总数中包含运费,那么在某种服务类别中将这种复杂性远离实体会更有意义。