gpt4 book ai didi

CakePHP 胖模型和瘦 Controller - appModel

转载 作者:行者123 更新时间:2023-12-02 11:58:41 25 4
gpt4 key购买 nike

为了遵循最佳 MVC 实践,我试图确保我的所有代码都遵循胖模型、瘦 Controller 方法,因此有人可以关注下面的内容并告诉我我是否走在正确的轨道上?

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

ExpenseClaims hasMany Expenses
Expenses belongsTo ExpenseClaims

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

因此,我认为执行此操作的最佳 FMSC 方法是在 AppModel 中加载 ExpenseClaim 模型

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

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

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

提前致谢

最佳答案

最好的 FMSC 方法是,正如您所说,在模型中编写函数。 但是!!不要在 AppModel 中执行此操作,这是不好的做法。为什么要在 AppModel 中放置与两个(最多)模型相关的代码? 每个模型都会继承该功能,这没有多大意义。假设您有一个“菜单模型”或“用户模型”,它们继承 totalExpenses 函数是不合逻辑的,对吧?我知道您希望每个 Controller 都可以使用该功能,并在需要时进行查看,但这不是实现的方法。

一步一步(实际上只需两步):

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)现在,在费用 claim 模型中拥有计算总计的函数是合乎逻辑的,因此可以在相应的 Controller 中使用,但您说您想在 pages/admin_index 中使用它,让我们假设 pages 与声明模型完全没有关系。好吧,那么你可以这样做

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

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

(都在 Controller 中),您无需将该函数放入 AppModel 中即可获得该值。

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

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

关于CakePHP 胖模型和瘦 Controller - appModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17190369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com