2009-11-10 84 views
12

我確信有人已經發布了這個問題;不過,我想在PHP上獲得有關MVC的所有建議。我知道有很多專家願意與那些懷疑他們的編碼最佳實踐的人分享他們的知識。PHP MVC最佳實踐/成功規則

  • 你應該如何組織你的控制器?
  • 你應該如何組織你的模型?
  • 控制器是否應該調用一個模型方法和模型調用子方法或控制器應該調用所有模型子方法?

希望這有助於有人出來(因爲它會幫助我肯定)。

+0

嘗試使用一個簡單的框架開始。讓我在非常有據可查的Codeigniter中指出:http://codeigniter.com/ – Frankie 2009-11-11 00:24:25

+0

當你理解模式本身時,我發現它更容易獲取mvc框架。 – Galen 2009-11-11 00:27:03

+0

我使用CodeIgniter,我不想製作自己的MVC框架或其他東西。只需要一些關於它的提示。 :) – MarioRicalde 2009-11-11 00:44:08

回答

37

MVC是最容易被誤解的設計模式。根據定義,有一種模式。

當城市規劃師提出一個項目時,他爲其設計了一個模型。模型可能包含的單獨實體:建築物,街道,公園,通常不是由單獨的模型表示的:它們都是單個模型的所有方面。

所以在MVC,該模型可以由不同的實體,這可能是它最好的詞:實體,如通過數據庫表表示的實體。 MVC中的模型甚至可能比代碼中實際表示的更抽象,而是應用程序可能需要採取行動的所有數據的概念保護傘。考慮到這一點,如果這些實體有它們自己的方法,特別是可能對應於CRUD方面(創建,讀取,更新,刪除)的方法,它們應該直接暴露給控制器,而不是而不是。低的抽象水平。應該將這些構建塊構建到更粗糙的粒度界面中,例如,您可以刪除記錄,但在刪除後返回記錄列表。控制器只需訪問執行上述所有操作的較粗粒度方法。如果存在關於ORM(對象關係映射)的實例的變化,則將實體的方法直接公開給控制器,可能導致控制器必須與實體類一起被重寫,系統正在使用中。我建議的中間層也是異常處理,日誌記錄和其他需要管理的管理員的好地方。

在較高抽象層次上建議的方法層有時被稱爲業務委託或「外觀」,但這是我真正考慮的模型。希望這不是太理論化,對OP或其他讀者有幫助。

+2

優秀的答案+1這實際上幫助了很多。人們使用MVC框架而沒有考慮到這些重要信息。如果您還有其他東西需要添加,請確實如此,因爲我希望聽到您的更多消息。 – MarioRicalde 2009-11-11 01:01:17

+0

除了通常可以在現有框架的上下文中應用這些想法之外,我沒有更多要添加的東西。 – 2009-11-12 13:00:22

+1

您可以爲網站設置模型,爲博客另設一個模型,以及設置控制器。 – 2012-10-02 22:54:25

0

我不確定你的意思是「組織」。

控制器呼籲任何模型[S],它需要爲了得到這些信息傳遞給視圖[S]。它(控制器)可以對模型進行多次調用以獲取不同的信息。

嘗試閱讀本:http://www.phpwact.org/pattern/model_view_controller

0

對於PHP,我喜歡用CodeIgniter的框架。它爲MVC的建立奠定了基礎。控制器保存在「/控制器」和模型在「/型號」

我相信控制器應該調用模型,模型應儘可能地封裝,如果需要使用子方法。這使得你的代碼更具適應性和靈活性。例如,今天你的模型正在從本地數據庫讀取數據,明天你可以從REST服務讀取數據。模型應該將數據返回給控制器,並且控制器應該對模型內部發生的事情天真。

3

我找到與您的問題相關的博客。

https://r.je/

湯姆·巴特勒在博客撰文指出,像大多數的MVC框架允許model-view互動是不正確的,並試圖解釋在MVC認爲應該用一些例子訪問模型直接

他有一個有效的點,但是來自Rails背景的 我發現很難吞噬view直接訪問model的想法。

-1

MVC的祕訣是「M」MODEL應該創建並設計爲VIEWMODEL,而不是簡單的模型。

比方說,我們有下面的例子:我們有一個表單時插入一個名爲Customer實體:

客戶

  • IdCustomer
  • 名稱
  • 國家。

MVC規則說我們應該將客戶模型發送到視圖。 但是,假設國家/地區字段中填充了組合框。然後,我們應該向VIEW發送國家列表。

enter image description here

因此,我們必須在下次視圖模型

CustomerViewModel

  • 客戶
    • IdCustomer
    • 名稱
    • 國家。
  • CountryList

此外,通常的形式是不作爲場而已作爲簡單,它有按鈕,標記/ MessageBox並且這樣。它應該在VIEWMODEL模型