原则2辅助方法的最佳实践



我经常在模型中使用辅助方法。例如,如果我的模型有一个"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调用,以将运输费用包含在总费用中,那么在某种服务类中,将这种复杂性从实体中分离出来会更有意义。

相关内容

最新更新