2010-05-19 76 views
4

如果我在我的站點上有一個頁面,我必須顯示4或5個片段(新聞源,事件源等),所有這些與不同的數據(在不同的模型和數據庫表中)有關,然後什麼是處理片段內容和佈局生成的明智方式?我可以使用一個包含靜態函數的片段控制器,每個靜態函數都返回一個填充相關數據的視圖。但是這個片段控制器中的每個函數都會與不同的數據/模型進行交互,所以我不確定這是如何OOP的。或者,我可以爲每個處理每個相關數據集的控制器添加一個靜態函數 - 例如在News_Controller中,以及顯示所有新聞項目,單個新聞項等的函數,我可以添加一個靜態函數通過簡單地返回我需要的視圖來生成新聞源。我認爲這種方法可能會起作用,因爲我不想爲這些簡單片段實例化一個對象,所以在相關控制器中使用靜態函數會有點意義。意識流的一點在這裏,但我有什麼意義?!在MVC中處理片段和視圖

+0

+1:好問題,我認爲你應該把它作爲每頁的方法,即爲每個頁面放置一個控制器,無論它包含什麼。 – Sarfraz 2010-05-19 16:35:07

回答

2

許多框架都有一些「偏好」的概念,通常用於這類事情。

由於這些部分通常是隻讀的,並且經常在每個頁面(或一些定義明確的頁面集合)上顯示,所以您可以在不考慮頁面控制器的情況下對其進行處理。

換句話說 - 記住,如果您的視圖/佈局代碼直接與您的模型對話,那麼只要它只是詢問它們就可以。

我做這樣的事情所有的時間:

layout.php中:

<div id="newsWidget"> 
<?PHP $news = Model_News::latest(); ?> 
<?PHP foreach($news as $newsitem): ?> 
<!-- output some news headlines --> 
<?PHP endforeach; ?> 
</div> 

Model_News ::最新()可能會執行一些緩存,等等,因爲這是佈局代碼,我可能不要每個請求都不想打到分貝。

無需控制器膨脹!

+0

框架在部分效率方面有所不同。我使用了與timdev推薦的緩存類似的方法,因爲我的部分出現在繁忙網站的每個頁面上。我發現,要平衡解決方案的「正確性」與快速完成工作並提供結果的實用性,這是非常棘手的。我會經常從一些簡單而醜陋的事情開始,當「代碼味道」變得太糟糕或者我需要在別的地方使用它時,會將它重構成更好的和更「更加直線的」(笑) – Steve 2010-05-19 22:00:51

+0

謝謝蒂姆,這是類型的東西,我可以陷入,即使它涉及簡單的功能和只有幾行代碼的每個片段。你的方法涉及最少量的代碼和重複,並且不涉及爲這樣一個簡單的任務創建新的控制器或助手。完美的感覺!任何時候只需要比News例子稍微複雜的代碼,那麼我想我會爲最相關的控制器添加一個靜態函數。 – kenny99 2010-05-20 08:52:57

0

您可以架構您的MVC模式,以提供一種機制,允許已將數據設置爲數組返回。例如,通常向/news/feed/發送網絡請求會導致相關數據被設置並隨後傳遞到視圖。除了Web請求之外,系統還應該允許控制器發出這樣的請求,即$vars = $this->call('/news/feed/');系統將識別內部請求並返回集合變量而不是調用視圖。

這可以讓你保持你的控制器和模型的凝聚力。

1

您可能想要查看分層模型 - 視圖 - 控制器(HMVC)。它特別適合製作帶有片段的網頁。我相信Kohana實現它。

基本上,您有多個模型 - 視圖 - 控制器三元組,每個負責每個片段。因此,您可以讓控制器訪問新聞數據庫,併爲不同類型的新聞顯示裝載各種小視圖。