2011-11-10 46 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所倡導的模型的模塊化/分離。 –