【问题标题】:Cakephp not sure if this business logic belongs in View?Cakephp 不确定这个业务逻辑是否属于 View?
【发布时间】:2013-03-27 17:39:33
【问题描述】:

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

你们都说什么?

【问题讨论】:

  • 对我来说看起来不错。您不会以任何方式操作数据,而只是导出需要显示的值。如果在模型中这样做,它可能会闻起来稍微好一点,但这闻起来并不明显。
  • 如果我从字符串转换为数组会怎样。比如,使用explode和implode函数;那绝对应该在模型中完成?
  • 如果纯粹是为了展示目的,IMO 也很好。您是否考虑过将此逻辑移至 Helper?此外,“5”似乎是一个“幻数”,最好将该数字移动到一个常数,和/或在 Helper 方法中设置一个参数
  • CakePHP 没有视图。它有模板。
  • CakePHP 确实有意见

标签: php templates cakephp


【解决方案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),因此计算是作为数据库查询的一部分进行的。

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

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

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

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

【讨论】:

  • 通过 PHP 计算不是最好的选择。为此使用virtualField 将允许您使用数据库执行此搜索;例如$this-&gt;Model-&gt;virtualFields['difference'] = '(Record.outstanding - Record.paid');。然后将该字段用作您的条件中的常规字段,例如'conditions' =&gt; array('Record.difference &gt;' =&gt; 0)
  • 正如我在回答中所说的那样 - “第三,我想说在这种特殊情况下最好的方法是使用虚拟字段 (book.cakephp.org/2.0/en/models/virtual-fields.html),因此会进行计算作为数据库查询的一部分。”
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多