1

我开始尝试使用 CakePHP,我正在考虑是否计算,可能是业务,确定在视图上呈现的内容的逻辑应该在视图中还是其他地方。

我最终将它们放在视图中的问题是因为数据仅在我执行 foreach 循环时可用。这是一个简单的例子:

    <?php foreach ($records as $record):
        $amountDifference = $record['Record']['outstanding'] - $record['Record']['paid']; 

        if ($amountDifference > 5){
            echo "greater than 5";
         }else{
            echo "less than 5";
         }

    endforeach; ?>

你们都说什么?

4

1 回答 1

1

有几点要指出...

首先,在这种情况下,您的代码可以正常使用。这是简单的东西,所以我会说它是否在模型或视图中并不重要。

我最终将它们放在视图中的问题是因为数据仅在我执行 foreach 循环时可用。

其次,更重要的是,重要的是要知道“foreach”循环没有障碍,如果你愿意,你可以在你的模型中轻松做到这一点。您只需在模型中创建一个方法,如下所示:

public function findAllWithAmountDifference(){
    $records = $this->find('all');

    // Now go through your records and adjust, before returning them
    foreach ($records as &$record):
        $record['Record']['difference'] = $record['Record']['outstanding'] - $record['Record']['paid'];
    endforeach;

    // Now your return value will have extra array keys with the difference
    return $records;
}

第三,我想说在这种特殊情况下最好的方法是使用虚拟字段(http://book.cakephp.org/2.0/en/models/virtual-fields.html),所以计算作为数据库查询的一部分进行。

最后,在什么被视为表示逻辑和什么被视为业务逻辑之间显然并不总是完全明确的。在像你这样的简单情况下,它可以是任何一种方式,而且不值得失眠。

严格来说,计算两个值之间的差异是对数据的操纵,因此属于模型。

话虽如此,如果您认为您的代码将更透明,并且更易于理解和维护,在您的视图中而不是模型中使用该代码,只需将它放在视图中!

关于代码理论和最佳实践的事情是,它们旨在作为使您的代码更易于调试/阅读/扩展/维护的一般指南。通常,它们非常好,但它们不是绝对规则。如果违反规则或最佳实践会真正使您的代码更易于调试/阅读/维护,那很好!违规走开!

于 2013-03-27T22:23:15.627 回答