2009-04-17 17 views
6

我目前使用CodeIgniter作爲我使用PHP時的選擇框架。我正在摔跤的一件事是「頁面」的想法,以及如何在MVC中正確表示。據我所知,CodeIgniter有一個前臺控制器,用於委託頁面控制器。在我的思考過程中,每個頁面都有它自己的控制器。雖然我經常看到有人使用頁面控制器塞滿了很多方法。所以從這個意義上說,每一個行動都成爲它自己的頁面。什麼定義MVC中的傳統「頁面」概念?

我從來沒有真正喜歡將許多方法塞進一個控制器的想法,因爲如果您一次只需要一個或兩個控制器中的一個或兩個方法,似乎會有太多的開銷。對於每個頁面來說,擁有自己的控制器似乎更合理,並且這些操作只會對應於您在該特定頁面上可以執行的操作。我在想這個錯誤的方式嗎?

是什麼讓它更令人困惑的是我會注意到,在一些Web應用程序中,他們將有一個控制器將有多種方法(即登錄,註冊,查看,編輯等),但在其他人他們實際上登錄控制器和註冊控制器。什麼是「頁面控制器」的正確使用?

回答

7

從域的角度來看,我肯定說每個域上下文有1個控制器會更有意義。雖然取決於上下文,但每個頁面不一定是一個,但情況可能如此。我的意思是「緊密相關的行動」。

例如,賬戶控制器應該處理登錄,註冊,註銷,更改密碼,操作。他們都住在「帳戶」的範圍內。例如,以Stackoverflow爲例。我會有一個「問題」控制器,它可以執行諸如DisplayQuestion,AskQuestion,刪除問題,MostRecent問題等操作。它們都是由一個控制器管理的不同「視圖/頁面」。

1

你說得對,控制器中的每個公共方法都變成了「頁面」。這就是說,它不一定是一個網頁,一個行動可能是一個數據後,然後重定向到另一個行動/頁面,所以頁面並不一定意味着「網頁」。

MVC使用了很多約定來使事情發揮作用。例如,每個控制器必須以「控制器」結束。因此,一組用戶頁面(創建,編輯,刪除等)將位於UserController中。在Views文件夾中,控制器類中的每個公共方法或操作都成爲與控制器前綴相匹配的文件夾(在本例中爲User文件夾)中的網頁。因此,控制器類中名爲「Delete」的操作將指向User文件夾中的Delete.aspx頁面。

將所有這些方法放在同一個類中看起來有些尷尬,但它根據您的對象組織了類似的功能。

+1

你關於每個控制器必須以「Controller」結尾的觀點只適用於Asp.Net Mvc框架,並不一定是他正在處理的PHP框架。 – Micah 2009-04-17 18:03:38

1

在MVC中,「頁面」是將三者放在一起時得到的。該模型處理數據層,該視圖處理用戶看到的實際HTML,並且控制器決定它們如何連接以顯示所需的數據。我選擇使用單獨的控制器或另一種方法到現有的控制器取決於操作與我擁有的其他控制器的接近程度。假設我想要一個UserAdmin控制器,現在可能最有可能處理添加用戶,刪除用戶,更改密碼等。如果我添加了以某種方式處理更改用戶帳戶的功能,我很可能會把它在那裏。如果我將它們分離到自己的控制器中,我自然會添加另一個控制器。控制器允許您將類似的任務放在一起,以便他們可以利用班上已有的任務,而不必重新創建已完成的任務。很多程序員認爲這是應該完成的。對你來說有意義的東西對我來說可能是沒有意義的,那就是開發者(或設計者)的選擇。