我经常在模型中使用辅助方法。例如,如果我的模型有一个"date"属性,我可能有getDateShort()或getDateLong()方法。把这些方法放在我的实体中可以吗?还是应该把一个模型类包装在实体周围,并把实体视为模型资源?
这是一个非常宽泛的问题。
一般来说,将这些类型的方法直接添加到实体中没有错。一个很好的经验法则是,如果这些方法只关心实体内部的数据,那么它们是可以的。
也就是说,格式化日期之类的操作可能更好地放在一些外部帮助程序类中,因为您可能希望对来自几个不同实体类的日期进行一致的格式化。
对于您的日期示例,您可能会考虑只实现一个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;
}
}
因此,内部(直接或通过关联)数据的各个比特进入订单总额的计算。但由于只有内部可见数据,因此在Order中包含getTotal()作为方法是很有意义的。
另一方面,如果您正在对某些运输服务进行API调用,以将运输费用包含在总费用中,那么在某种服务类中,将这种复杂性从实体中分离出来会更有意义。