2011-11-10 44 views
0

我需要遍历类别,然后遍历每个类别中的顶级存储,并且对MVC来说相对较新我不确定如何实现与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); 

    } 

} 

这是解决这个问题的正确方法还是我的内疚感是正确的?

非常感谢

回答

1

好:

您正在使用控制器来填充要在视图中使用的数据。 您正在)模型调用getCategoryList(与本地的SQL等

坏:

包装纸循环内的模板调用。你应该像从前那样将getCategoryList()中的行本地化为$ data数据,然后用$ data数组调用模板一次,然后你的模板将遍历$ data。

指针:

你的控制器应尽可能轻,但有这点上有些回旋余地。如果您有指定要返回哪个类别的业务逻辑,则需要确定是否将从多个代码点访问逻辑。如果是这种情况,我建议您将业务逻辑放到一个集中位置(新类),该位置负责提取模型数据,按照业务规则对其进行按摩,然后将数据返回给调用代码。如果它是一次性的业务逻辑规则,那么放在控制器内是安全的。

+0

所以你说的选择控制器和模型之间的桥接类? –

+0

你懂了!如果在通过视图呈现数据时需要考虑任何业务逻辑,并且希望可以从多个代码点访问逻辑。一些功能齐全的框架(Symfony)使用ORM(doctrine/propel)实际上有'Table'或'Peer'类,您可以在其中放置业务逻辑。 –

+0

最后,这是我的解决方案,谢谢。 –

1

你说得对想要避免肥胖控制器,托马斯之外,你再也不想见到那个家伙的坦克发动机。 :)

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

1

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

StoresModel类也是如此。此外,类别的商店应该可以通过CategoryModel这样的实例进行访问:$category->getStores()stores属性应该由您的ORM设置。另外,你不应该在你的控制器中注入模型(但是我相信你是这么做的,因为你使用的模型就好像它们是存储库一样)。

2

很多人还在争论这个问题,如'胖模型'或'瘦模型'。 如果你问我,你应该考虑你自己的代码,并决定你将把你的代码放在哪里,以这样的方式,将来你将最大限度地使用你的代码,你的应用程序将很容易扩展。 这取决于你,只要确保你不会在视图中推动你的代码。这是非常错误的。

+0

MVC只是一个模式,好点。 +1 – hakre

+1

肥胖模型被认为更好的原因是因为它有助于重用性。如果控制器中实现了大量的功能,那么这往往意味着您无法将模型移动到另一个项目,或者在另一个控制器中使用它,而无需复制控制器代码块。当然这是一种判断,当这是值得的,但不是时,但作为一个经验法则,胖模型瘦控制器通常是一种很好的方法来遵循 – GordonM

+0

我同意,但在我的练习中,当我有一些算法逻辑,还是有点复杂的逻辑,我在类中分离代码,...我喜欢使用控制器,如所有逻辑(模型,帮助器,其他类)之间的桥梁......但这只是我的方式喜欢做事情,对我来说工作得很好。 – Antagonist

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

这对我来说似乎是一个明智的建议,因为它将保持本地模型,同时仍然保持MVC所倡导的模型的模块化/分离。 –