2011-10-13 52 views
1

什麼時候應該製作新的模型或控制器?是否應該只有控制器與相應的視圖1對1,並且在控制器和模型中一樣?或者,讓控制器的功能與任何特定視圖無關是好的做法嗎?舉例來說,如果所有投票代碼都進入投票控制器,或者分散在具有投票意見的控制器中,則可以進行投票。似乎可能是一個表決控制器是最好的。codeigniter中的MVC設計PHP

+0

[胖模型,瘦身控制器和MVC設計模式]的可能重複(http://stackoverflow.com/questions/467113/fat-models-skinny-controllers-and-the-mvc-design-pattern) – Gordon

+0

可能重複[MVC在PHP中:脂肪模型或脂肪控制器](http://stackoverflow.com/questions/4568553/mvc-in-php-fat-model-or-fat-controller) – Gordon

回答

5

首先,你實際上不能在php中實現經典的MVC。您可以做的最好的是Model2 MVC。

  • 模型 - 負責所有的業務邏輯。沒有關於的線索,其中數據存儲或實際來自。存儲和檢索是DataMappers或DAO的責任。模型本身應該從來沒有包含SQL。永遠。
  • 控制器 - 將模型綁定到視圖並更改兩者的狀態。它不會從模型中檢索信息以將其發送到查看。
  • 查看 - 負責所有表現邏輯。從模型中檢索信息並將其綁定到適當的模板。查看本身不是模板

你可以有1:1視圖之間的關係控制器或many:many。這取決於你如何實現視圖本身。

例如,您的視圖可能需要一個單獨的對象來處理渲染。並提供不同類型的對象(這是多態性很重要的地方),你可以讓你的視圖呈現XML,HTML或JSON。

或者您可以通過更改模板來做同樣的事情。如果基本表示邏輯沒有改變,並且您爲每個表單提供了不同的模板,則類ListView可以呈現文章列表以及用戶列表。

在投票的情況下,對於所有投票相關的操作似乎都有一個控制器,並且您可以通過切換輸出模板來獲得單個視圖。

+0

關於視圖對象的好處和模板不一定是相同的東西。在一些框架中,視圖對象是通過加載相關模板來創建的,因此區分有點模糊。 –

+0

我不同意你,這裏是更正確的MVC模型:http://symfony.com/doc/current/book/controller.html(他們確實實現了它,所以這是可能的)。 –

+1

@OZ_,實際上symfony模型的鏈接是[this](http://symfony.com/doc/current/book/doctrine.html)..並且他們幾乎只談論ORM。在一些例子中,它甚至看起來像是他們在控制器中有SQL片段..當談到SF和編碼實踐時,我有點兒警惕=/ –

2

這種事情的一些是喜好和意見,沒有一個正確的方法。有些方法可能更靈活,但可能會以更復雜爲代價。

關於您的「投票」的例子,這可能取決於投票將如何在您的網站中使用。投票是否會出現在不同類型的網頁上?如果是這樣,某種組件是一個好方法;然後可以使用投票組件視圖在不同頁面中顯示其數據,投票組件控制器接受投票結果,然後可能重定向到其他位置(或通過Ajax請求接受投票)。

很多時候你會發現模型(和控制器)或多或少以1:1映射到數據庫中的表。所以如果我有一個表users,我可能有一個相應的User型號,和UserController控制器。

記住控制器打算做什麼:響應請求,確定需要加載哪些模型,然後要求他們存儲,操作並返回數據,然後將數據傳輸到視圖中進行顯示。讓控制器不直接映射到模型是很好的。您可能有一個名爲DebugController的控制器,該控制器響應請求http://examples.com/debug/,並且不直接映射到Debug模型和表,但收集有關係統和各種模型的信息(當然,有所有這些東西應該被封裝成Debug模型,該模型依次加載其他模型並組裝控制器請求的數據。

至於視圖,您通常會有給定控制器的多個視圖;往往每動作一個視圖。所以UserController::indexAction()views/user/index.php,UserController::editAction()views/user/edit.php

1

該方法可能是靈活的,這是真的。

模型 - 描述與數據庫直接通信的層,即所有SQL查詢。 您可以爲DB中的每個表創建模型,該模型將處理與該表連接的所有操作(選擇,插入,更新,刪除)。 您可以爲應用程序中的每個「邏輯實體」設置模型,以處理此實體的操作。就像你的例子「投票」一樣,你可以定義這個模塊的邏輯。 (檢查是否用戶已經投媒體鏈接,getVoteCount ...)

的Controler - 處理由模型執行功能(他們不應該在DB直接comunicate)並將處理後的數據傳遞給適當的查看請求。如果您需要在不同的頁面上以不同的方式呈現相同的數據,那麼控制器應決定發送數據的視圖。

查看 - 您需要查看您應用程序中每個頁面,窗體,模塊。你將如何組織觀點來進行個人實驗。