在MVC模式中循环遍历数组的正确方法

时间:2011-11-10 15:55:58

标签: php model-view-controller

我需要遍历类别,然后是每个类别中的顶级商店,并且对于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);

  }

}

这是实现这项任务的正确方法还是我的内疚感是正确的?

非常感谢

5 个答案:

答案 0 :(得分:2)

许多人仍然在讨论像这样的问题,胖模型' v.s'瘦身模特' 。 如果你问我,你应该考虑你自己的代码,并决定你将把你的代码放在哪里,以便将来你最大限度地利用你的代码和您的应用程序将易于扩展。 它取决于你,只要确保你不会在视图中推动你的代码。那是非常错误的。

答案 1 :(得分:1)

你想要避开Fat Controller是正确的,在托马斯坦克引擎之外你永远不想看到那个人。 :)

在这种特殊情况下,我倾向于认为你的代码是表现性的,因此最好放在视图中。记住模型应该对它们的使用方式一无所知。出于这个原因,我个人倾向于将$this->CategoryModel->getCategoryList()分配给视图变量并让视图实现foreach循环。

答案 2 :(得分:1)

我不明白为什么CategoryModel的实例应该负责检索类别列表。模型存储有关数据库中一个条目的数据。您要做的事情应该放在模型的存储库类中。存储库负责从数据库中检索条目。因此,您应该有两个类:CategoryModelCategoryRepository

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;
}