2010-05-16 42 views
1

我正在做一個使用MVC模式的PHP網站。我沒有使用框架,因爲該網站非常簡單,我覺得這會給我一個直接瞭解該模式的好機會。我有幾個問題。MVC:嵌套視圖和控制器(對於一個網站)

問題1:我應該如何組織我的觀點?我正在考慮使頁面視圖具有頁眉和頁腳,並且允許將內容視圖嵌套在它們之間。

問題2:如果我有5個內容頁面,我應該製作5個不同的視圖,可以用作嵌套在頁面視圖中的內容嗎?或者,我是否應該讓它們都擴展一個名爲AbstractContent的抽象視圖?

問題3:控制器怎麼樣?我認爲至少應該有一個主控制器。但是那麼請求從那裏發出?到另一個控制器?或者我應該只是打電話給頁面視圖,並把它留在那?我認爲控制器應該處理輸入,可能會修改一個模型,並選擇一個視圖。但是如果其中一個視圖嵌套在控制器調用的視圖中,需要額外的輸入才能解析呢?

問題4:控制器是否允許將參數傳遞到視圖中?或者應該簡單地修改模型,然後影響視圖?還是僅用於數據庫訪問和其他類似事情的模型?

回答

2

1 - 這是一個偏好問題。最簡單的方法是有一個單獨的頁眉和頁腳文件。然後,你可以做這樣的事情在你的頁面控制器

$title="Page Title"; 
$var1 = 'var1'; 
$var2 = 'var2'; 
$var3 = array("asdf","adsfasdf","234");  

include(HEADER); //$title is in header 
include(DIR_VIEWS . 'page.php'); //$var1/2/3 are in page.php 
include(FOOTER); 

// variable were created before pages were included so they will be set in the templates 

如果你去,你將不得不開始與str_replace函數擺弄嵌套路徑和啓動對模板引擎的標題,超出範圍的這個答案。

2 - 無需製作視圖對象。一個「視圖」可以只是一個包含該視圖的html文件的文件。就像我上面的例子。這些頁面也可以包含基本的php以循環/回顯變量。

3 - 您正在描述前端控制器(有時稱爲調度程序或路由器)。這真的是要走的路。有幾種創建前端控制器的方法。

你可以有一個指向控制器的網址數組。

$routes = array (

    '~^/home/$~' => 'home.php', 
    '~^/contact/$~' => 'contact.php', 
    '~^/blog/.*?$~' => 'blog.php' 

); 

或者您可以使用url中的第一個「目錄」作爲控制器名稱並從控制器目錄加載該文件。

4 - 控制器的全部要點是從模型中獲取信息並將數據傳遞給視圖。


編輯的評論


如果你想了一堆意見,有一個側邊欄,你只是包括其他的觀點看法。例如:

<div id="content"> 
    <p>lorem ispum stuff</p> 
</div> 
<?php include(DIR_VIEWS . 'sidebar.php'); 

只要確保在與側邊欄的「控制」頁面,包括側邊欄功能的一些代碼控制器:

if ($_GET['keywords']) { 
    $sidebar_search_results = get_search_results($_GET['keywords']); 
} 
// this code should be in a file that you include 

$sidebar_search_results可能是導致你的側邊欄視圖解析數組並顯示。

+1

對於嵌套視圖,我認爲我的問題是:如果我有4個非常不同的視圖 - 但它們都共享一個公共元素(讓我們說新聞面板)。我想讓新聞面板在4個主視圖中的每一箇中都嵌套。問題是新聞面板需要從某處獲取數據。如果新聞小組有搜索功能呢?那麼它也需要一個控制器,以確保搜索參數正在處理中。我怎麼能這樣做? – Cam 2010-05-16 21:24:47

+0

@ Galen的「編輯點評」:對於嵌套的觀點,這個想法是觀點應該是相當獨立的 - 也就是說,我希望能夠立即將它們切換出來。這種方式雖然,我添加了不必要的代碼給頂部的控制器,如果我有太多深層嵌套的視圖,這可能會變得非常煩人。你怎麼看? – Cam 2010-05-16 23:46:48

+0

如果您有搜索功能,您將需要代碼來執行搜索。無論如何,這必須在控制器中。如果您需要切換側邊欄的佈局,只需使用新代碼覆蓋sidebar.php即可。 – Galen 2010-05-17 00:07:35

2
  1. 想想你會希望你的HTTP響應看起來像什麼樣的方式:全頁/無導航,印刷剝離頁,JSON & XML響應,索引/地圖。在您感覺網站正在形成之後,添加越來越多的捷徑,以儘可能少的代碼獲得您的迴應。
  2. 如果頁面佈局相似,我會使用相同的視圖並從模型(可能是數據庫)中加載內容。
  3. 查看Front Controller pattern:您應該始終能夠在單個輸入點中交叉請求。我會在你的控制器前面放一些分層的東西,然後每個「主頁」(論壇,博客,新聞)都有一個控制器。這足以控制,但你必須決定哪些塊足夠大/足夠小。
  4. 控制器負責傳遞到視圖中的所有內容。控制器應該取數據&設置&什麼不是從模型,並傳遞到視圖。
+0

這是有幫助的; +1 :)。但我認爲控制器會更改模型(即更新數據庫等),而視圖則從中獲取數據(如下圖所示:http://en.wikipedia.org/wiki/Model%E2%80%93view% E2%80%93controller)。情況並非如此嗎? – Cam 2010-05-16 20:57:38

+1

我現在仔細閱讀,你說:「我認爲控制器應該處理輸入,可能會修改模型,並選擇一個視圖。」我同意,所以是的! – chelmertz 2010-05-16 22:47:27

+0

所以視圖應該能夠直接從模型中獲取數據?例如,我可以讓控制器修改一些用戶設置,並讓視圖從模型中獲取這些設置(/ c的mdoel會提供一個易於使用的界面)? – Cam 2010-05-16 23:43:33

2

問題1:

這的確是一個辦法做到這一點,和一個我百達使用。

問題2:

只是保持意見儘可能簡單。我傾向於創建5個單獨的視圖(純php文件)。

問題3:

在正常MVC模式,有一個前端控制器(何種操作系統只是一個引導文件,在index.php),它執行一個控制器。

在HMVC中,控制器可以向其他控制器發送附加請求。

問題4:

正常的MVC模式適用於正常的應用程序,其中意見是持久的,並且可以觀察到的模型。使用Web應用程序這是不可能的,因爲每個請求的一切都被重新加載。所以最常用的模式是讓控制器將參數傳遞給視圖。

+0

+1,謝謝。 1,2,3是有意義的。對於4,很高興知道我可以將參數傳遞給視圖。但是,我是否也可以將視圖與模型交互以從數據庫獲取信息,還是應該由控制器提供?另外 - 每個視圖都需要一個控制器和一個模型嗎?我正在考慮更多的是每個視圖都有一個控制器,並且我需要從每個數據庫中抽取一個模型。 – Cam 2010-05-16 21:03:15