我需要遍历类别,然后是每个类别中的顶级商店,并且对于MVC来说是相对较新的我不确定如何按照MVC原则来实现这一点。
目前我正计划做这样的事情,但现在我看一下,我看到了很多我觉得应该在模特中的东西:
我的控制器看起来像这样:
public function category_list() {
foreach ($this->CategoryModel->getCategoryList() as $cat) {
$data['cat_title'] = $cat['category_title'];
$data['list']['stores'] = $this->StoresModel->getStoresByCategory($cat['category_id']);
$this->_Load->view('stores_by_category.tpl', $data);
}
}
这是实现这项任务的正确方法还是我的内疚感是正确的?
非常感谢
答案 0 :(得分:2)
许多人仍然在讨论像这样的问题,胖模型' v.s'瘦身模特' 。 如果你问我,你应该考虑你自己的代码,并决定你将把你的代码放在哪里,以便将来你最大限度地利用你的代码和您的应用程序将易于扩展。 它取决于你,只要确保你不会在视图中推动你的代码。那是非常错误的。
答案 1 :(得分:1)
你想要避开Fat Controller是正确的,在托马斯坦克引擎之外你永远不想看到那个人。 :)
在这种特殊情况下,我倾向于认为你的代码是表现性的,因此最好放在视图中。记住模型应该对它们的使用方式一无所知。出于这个原因,我个人倾向于将$this->CategoryModel->getCategoryList()
分配给视图变量并让视图实现foreach循环。
答案 2 :(得分:1)
我不明白为什么CategoryModel
的实例应该负责检索类别列表。模型存储有关数据库中一个条目的数据。您要做的事情应该放在模型的存储库类中。存储库负责从数据库中检索条目。因此,您应该有两个类:CategoryModel
和CategoryRepository
。
StoresModel
类同样如此。此外,类别的商店应该可以通过CategoryModel
实例访问,如下所示:$category->getStores()
。 stores
属性应由您的ORM设置。
另外,你不应该在你的控制器中注入模型(但我相信你这样做是因为你使用模型就好像它们是存储库一样)。
答案 3 :(得分:1)
好处:
您正在使用控制器填充要在视图中使用的数据。 您正在对getCategoryList()与native sql等进行模型调用。
坏事:
在循环中包装模板调用。你应该将getCategoryList()中的行本地化为$ data,就像你做的那样,然后使用$ data数组调用模板一次,然后你的模板将迭代$ data。
指针:
您的控制器应尽可能轻,但这里有一些摆动空间。如果您具有指示要返回哪些类别的业务逻辑,则需要确定是否将从多个代码点访问逻辑。如果是这种情况,我建议您将业务逻辑放入一个集中位置(新类),该位置负责提取模型数据,根据业务规则对其进行按摩,然后将数据返回到调用代码。如果它是一次性业务逻辑规则,那么放入控制器是安全的。
答案 4 :(得分:0)
你的代码看起来很好,但如果你真的希望你的控制器 ONLY 将数据从模型桥接到视图,那么foreach()循环应该在模型中完成,你的代码应该像:
/* controller side */
public function category_list()
{
$this->_Load->view('stores_by_category.tpl', $this->StoresModel->getFormattedCategoryList());
}
/* model side */
public function getFormattedCategoryList()
{
$data = Array();
foreach ($this->getCategoryList() as $cat)
{
$data['cat_title'] = $cat['category_title'];
$data['list']['stores'] = $this->getStoresByCategory($cat['category_id']);
}
return $data;
}