3

为了遵循最佳 MVC 实践,我试图确保我的所有代码都遵循胖模型,瘦控制器方法因此有人可以将目光投向下面并告诉我我是否走在正确的轨道上?

目前在我的应用程序中,我有

ExpenseClaims hasMany Expenses
Expenses belongsTo ExpenseClaims

在我的 pages/admin_index.ctp 中,我需要获取属于每个列出的 ExpenseClaim 的所有费用的总数。

所以,我能看到的最好的 FMSC 方法是在 AppModel 中加载 ExpenseClaim 模型

App::uses('ExpenseClaim', 'Model');

然后在 AppModel 中有一个函数,我可以在应用程序控制器中使用它(因为它在 appModel 中),我可以将 ExpenseClaim ID 传递给它,它将返回所有相关费用的总数。

这是最正确的 MVC 方式,而不是在控制器中完成这一切吗?

提前致谢

4

1 回答 1

8

正如您所说,最好的 FMSC 方法是在模型中编写函数。但是!!不要在 AppModel 中这样做,这是不好的做法。为什么要将与两个(最多)模型相关的代码放在 AppModel 中?每个模型都会继承该功能,这没有多大意义。假设您有一个“菜单模型”或“用户模型”,它们继承一个totalExpenses功能是不合逻辑的,对吧?我了解您希望在每个控制器中都提供该功能并查看是否需要增加,但这不是这样做的方法。

一步一步来(其实就是两步):

1) 在 ExpenseClaim 模型中,编写一个新函数来计算总费用

class ExpenseClaim extends AppModel {
      /* definitions and validations here*/

      public function totalExpenses($id) {
          return $this->Expenses->find('count', array('conditions'=>
                                                   array('expense_claim_id' => $id)));
      }
}

因此,在 ExpenseClaimsController 中,您可以使用

$total = $this->ExpenseClaims->totalExpenses($the_id);

2) 现在,在费用报销模型中计算总数的功能是合乎逻辑的,因此可以在相应的控制器中使用,但是您说您想在pages/admin_index中使用它,让我们假设pages与索赔模型。那么,你可以做

ClassRegistry::init("ExpenseClaims")->totalExpenses($the_id);

或者

$this->loadModel("ExpenseClaims");
$this->ExpenseClaims->totalExpenses($the_id);

(都在控制器中)并且您将获得该值,而无需将该函数放入 AppModel 中。

(顺便说一句,我写的代码应该可以工作,但是您需要微调控制器和模型名称或在这里和那里关闭括号,我还没有测试过)。

现在,这是一般的最佳实践。适用于大多数情况,具有更复杂的功能。但是对于您的具体情况,您可能想看看 cake 的counterCache,它可以计算东西而无需您做太多事情。

于 2013-06-19T14:32:18.473 回答