3

我已經採取了看看這個:MVC,填充我的演示模型的最佳實踐是什麼?

http://r.je/mvc-in-php.html

根據它,我將具有以下基本守則:

//Instance of a Model 
$model = new Model(); 

//Controller and View get the Model 
$controller = new Controller($model); 
$view = new View($model); 

//Controller change/work with the Model 
$controller->doSomeAction(); 

//Display the final Model 
$view->display(); 

我已經實現我的領域驅動設計中的應用。但是現在我被卡在了presenetation層,我想在經典的MVC中實現它。

此刻,我的控制器將使模型的實例和視圖(這似乎是錯誤的上面的代碼):

//Get Model 
$model = $myRepository->findById(42); 

//Do Some stuff 
$model->foo = 'foo'; 
$model->bar = 'bar'; 

//View 
$view = new MyView($model) 
$view->render(); 

的標識42從正在添加請求。但我怎麼能根據第一個真正的MVC代碼轉移它?我的意思是,我沒有靜態模型,該模型是通過請求動態的。

事情是這樣的感覺錯了,因爲模型瞭解的請求:

class MyPresentationModel extends PresentationModel { 
    public $foo; 
    public $bar; 

    public function __construct($request) { 
     //init myRepo... 
     $obj = $myRepo->findById($request->get(42)); 
     $this->foo = $obj->getFoo(); 
     $this->bar= $obj->getBar(); 
    } 
} 

那麼,什麼是填補我的演講模式的最佳實踐?

回答

4

完全披露:我是該文章的作者,因爲這個URL作爲分析引用者出現在這裏,因此被延期回覆!

這是一個關注問題的分離。關於請求對象應該知道什麼?如果你問「請求對象包含什麼?」,那麼答案很簡單。那麼,「42」是用戶選擇查看關於具有該ID的記錄的一些信息,因爲它本質上是用戶動作「我想看到記錄42」。

正因爲如此,控制器應該可以訪問請求對象:

class Controller { 
    private $request, $model; 

    public function ___construct(Model $model, Request $request) { 
     $this->request = $request; 
     $this->model = $model; 
    } 

    public function viewAction() { 
     $this->model->load($this->request->id); 
    } 
} 

該模型可以是動態的,基於請求,但它是路由器的工作,控制器不工作選擇模型。其原因是靈活性,您可以使用一個模型從數據庫或具有相同API的模型加載記錄,這些API從CSV文件或Web服務加載記錄,如果您構造這些模型,則所有這三個模型都可以互換控制器中的模型意味着您需要爲每個模型選項設置一個控制器,因爲重複的代碼會導致混亂。

觀點也是如此。你可以有一個顯示輸出爲HTML的視圖,另一個顯示JSON記錄,另一個顯示爲RSS提要,另一個顯示爲PDF ..但是他們都使用相同的控制器和模型。

鏈接這一切顯示了MVC的靈活性。隨着等級:

HTMLView PDFView RSSView

控制器

DatabaseModel CSVModel WebServiceModel

你有可能的選項數量驚人:

  • 從獲取數據數據庫並將其顯示爲HTM大號
  • 從數據庫中獲取數據,並從數據庫中顯示它的PDF
  • 獲取數據並顯示它作爲RSS
  • 從CSV獲取數據並顯示它作爲HTML
  • 從CSV獲取數據並顯示它作爲PDF
  • 從CSV獲取的數據和從Web服務顯示它作爲RSS
  • 獲取數據並顯示它作爲HTML
  • 從Web服務獲取數據並顯示它作爲PDF
  • 從Web服務獲取數據並將其顯示爲RSS

一直使用相同的可重用類集。這是MVC的美妙之處,以及爲什麼組件是獨立的實體。