Cakephp不确定这个业务逻辑是否属于View


Cakephp not sure if this business logic belongs in View?

我开始使用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; ?>

你们都说什么?

有几点需要指出…

首先,在这种情况下,您的代码是正常的。这是很简单的东西,所以我想说,它是在模型中还是在视图中都没有太大关系。

我最终将它们放在视图中的问题是因为数据是只在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),这样计算就会作为数据库查询的一部分进行。

最后,在什么是表示逻辑和什么是业务逻辑之间显然并不总是有一个完全清晰的界限。在像你这样简单的情况下,两种情况都有可能发生,不值得为之失眠。

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

话虽如此,如果你认为你的代码将更透明,更容易理解和维护,在你的视图中而不是你的模型中使用代码,那就把它放在视图中!

关于代码理论和最佳实践的事情是,它们的目的是作为一个通用指南,使你的代码更容易调试/阅读/扩展/维护。通常,它们都很好,但它们不是绝对的规则。如果违反规则或最佳实践真的会让你的代码更容易调试/阅读/维护,那就好了!违反了!