1

概述:我正在使用PHP構建一個CMS,並且我正在嘗試使用MVC實現這一點。我試圖使用this structure來擴展我的代碼,因爲它代表了MVC的精確表示,並且非常簡單。爲了與我的數據庫進行通信,我使用了域對象和數據映射器。模型,視圖和控制器在PHP MVC實現中的映射

問題:

  • 是否真的需要有一個1:1:模型,視圖和控制器之間的一對一映射?

例子:對於一個博客系統,顯示博客條目頁面時,我會創建一個名爲DisplayEntryController控制器,以及一個名爲DisplayEntryView查看。該視圖將從BlogMapper類(與數據庫通信以檢索當前的博客條目)和CommentMapper類(與數據庫進行通信以檢索當前博客條目的評論)中獲取其信息。考慮到該視圖適用於2個模型對象,這是否是一種好的做法?如果不是什麼替代方案?如果是的話,怎樣才能以通用的方式實施?

  • 多個控制器可以處理一個頁面嗎?對於上面的例子,是否可以通過DisplayEntryController和CommentController處理顯示博客條目的頁面的相關部分?如果是的話,2個控制器將如何協調?

在此先感謝您。例子將不勝感激。


我在網上看到的大多數PHP MVC實現都使用頁面方法來組織他們的MVC。例如。對於主頁,您有一個視圖,一個控制器和一個模型。在MVC中進行1:1:1映射的路由很簡單,因爲您可以強制執行MVC組件的位置和命名,並且當主頁出現請求時它會自動查找以下類:HomeView HomeController和HomeModel。

這在大型項目中顯然不起作用。如何處理路由以支持路由到多個模型(DataMapper),多個視圖,而不會創建過度複雜的路由器或添加複雜的依賴關係注入層?

示例:如上所述,顯示博客條目時,顯示 博客條目代碼和評論部分。爲了達到這個目的,它 與兩個DataMapper進行通信,這兩個DataMapper獲取博客條目, 和返回博客評論的那個。如何分配視圖 與這兩個數據加載器一起使用以從 獲取數據庫中的數據?

+1

不,MVC部件之間有1:1:1映射實際上是錯誤的,因爲這些「部件」甚至不在相同的「權重組」中。模型是一個圖層,而控制器和視圖是類。多個控制器*可以從同一頁面到達,但我不知道「座標」是什麼意思。 –

+1

在MVC中進行1:1:1映射的路由非常簡單,因爲您可以強制執行MVC組件的位置和命名,並且當主頁出現請求時,會自動查找以下類:HomeView HomeController和HomeModel。 當視圖與多個模型(DataMapper)通信時,如何處理路由,而不添加複雜的依賴關係注入層? –

+1

示例:如上所述,顯示博客條目時,您將顯示博客條目代碼和評論部分。爲了達到這個目的,它與兩個DataMapper進行通信,這兩個DataMapper獲取博客條目,併爲博客返回評論。如何分配視圖以使用這兩個數據手段從數據庫獲取數據? –

回答

2

沒有要求模型,控制器和視圖的1:1映射。

MVC提供了一種分層方法來處理您的應用程序的概念,每個層由'代理'處理以實現他們認爲合適的方式。爲了進一步解釋這一點,請考慮以下情況。

假設您處理數據,然後將它們交給某人存儲。只要信息在需要時再次可用,您就不在乎它們存儲在何處以及它們如何存儲數據。你可以愉快地處理你的數據,然後告訴他們,例如'這是客戶端X的項目數據,存儲它',然後說'你能否給我客戶端X的項目數據'。

SO MVC以這種方式工作,無論數據存儲員將所有數據轉儲到一起還是將它們打包都不重要。然而,重要的是發送和檢索時雙方之間的接口。例如,您可以決定將信息存儲爲客戶端數據或項目數據或兩者。

同樣,您可以讓代理收集數據並將其處理給您處理。你不關心他們使用多少接口(例如,電話,網絡,電子郵件,移動設備),但你關心他們交給你的數據。 (當然,一個規則可能會決定只有Web信息必須被處理)。所以收集數據的界面可能會有所不同。

因此,每個代理都可以使用最有效的方法(甚至將它們合併或拆分)來使系統工作在其側面,因此不存在數據映射。

+1

這聽起來很合理。然而,我在網上看到的大多數PHP MVC實現都使用頁面方法來組織他們的MVC。例如。對於主頁,您有一個視圖,一個控制器和一個模型。這在大型項目中顯然不起作用。 如何處理路由(在1:1:1映射中它很容易,因爲它使用頁面名稱來查找HomeModel HomeController和HomeView)以支持路由到多個模型,多個視圖,而不會創建過度複雜的路由器? –

+1

正確觀察。我建議使用基於業務對象的方法。這通常由數據表(例如Order)表示。但是,它應該是您的控制器的基礎。問問自己「允許哪些業務功能。」對此的回答將形成控制器操作(添加,刪除,打印,搜索等),並將指示視圖(例如訂單頁面)和模型(例如訂單,訂單項目,產品)。 – crafter