簡體   English   中英

將數據從MVC Controller傳遞到PHP中的View

[英]Passing data from MVC Controller to View in PHP

對於我正在研究的一些項目,我有自己的手動PHP MVC框架。 當我第一次創建框架時,它是在構建管理CMS的上下文中。 因此,模型,視圖和控制器之間存在非常好的一對一關系。 數據庫中有一行,它映射到單個模型。 控制器加載模型並將其傳遞給要渲染的視圖(例如進入編輯表單)。 很好,干凈,容易。

但是,現在我正在網站的前端工作,事情變得棘手了。 頁面並不總是單個模型的視圖。 它可能是一個包含20個用戶的用戶目錄(每個用戶模型)。 此外,可能存在關於請求的元數據,例如分頁(當前頁面,總頁數,結果數量)和/或搜索查詢。

我的問題是,將所有這些數據傳遞給視圖的最簡潔方法是什么?

我正在考慮的一些選擇:

  • 讓控制器創建一個數組並將其作為單個參數傳遞給視圖:

     class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $data = array() $data['models'] = $models; $data['currentPage'] = $current; $data['totalPages'] = $total; return $view->render($data); } } class UserView{ public function render($data){ // render the data } } 
  • 在視圖類中創建屬性並讓控制器填充它們:

     class UserView{ public $models; public $currentPage; public $totalPages; } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->models = $models; $view->currentPage = $current; $view->totalPages = $total; return $view->render(); } } 
  • 為視圖提供某種泛型HashMap或Collection對象作為容器,可以容納任意數量和數據名稱。

     class UserView{ public $collection = new Collection(); // works like a Java collection } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->collection->add($models,'models'); $view->collection->add($currentPage,'currentPage'); return $view->render(); } } 

我知道技術上任何一個都可以工作,但我不確定最佳選擇,或者是否有一個更好或更傳統的選擇,我缺少。

我將推薦Fat Models,Skinny Controllers (或者Fat Models Thin Controllers,如果您願意......)的概念

換句話說,你的模型太嚴格了 - 將你的模型綁定到只表示像RowDataGateway這樣的東西是非常有限的。

事實上,我認為好的模型隱藏了你從數據庫中讀取數據的事實。 實際上,因為您的數據可能位於文本文件中,也可能來自Web服務或其他任何內容。 如果你認為你的模型只不過是一個美化的DBAL,你就會在控制器中使用緊密耦合的代碼,這樣你就不會讓你脫離“數據來自數據庫”的思維方式。

我已經看到了流行的MVC /模板框架中實現的前兩種方法。

django使用第一種方法,將視圖用來填充模板的變量字典傳遞給視圖。

smarty使用第二種方法,創建Smarty對象並為容器中的每個屬性分配值。

您的第三種方法似乎與第二種方法基本相同,但架構方面存在細微差別。

真的,我想我還沒有說過你沒想過的任何事情。 基本上,這些都是聽起來的想法,所以要實現你覺得最舒服的任何東西。

在我使用的那個中,它在控制器中自動擁有一個view屬性,您可以訪問視圖上的方法和屬性。 然后可以在視圖視圖'$ this'中訪問所有公共屬性,因為視圖在其自己的對象上下文中呈現。

在控制器中:

$this->view->myVar = 'test';

在視圖中:

$this->myVar; // 'test'

布局也是如此,因為它們都是同一視圖對象的獨立實例:

$this->layout->myVar = 'test';

然后在布局中:

$this->myVar; // 'test'

該框架曾經是專有的,但即將向公眾發布。 如果您認為有幫助,我很樂意向您發送一些代碼。 請記住,最簡單的答案通常是最好的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM