2013-10-07 40 views
1

我想知道該視圖如何與模型進行通信。視圖如何與模型進行通信?

據我所知,控制器將正確的信息引導到模型。

class Controller 
{ 
    public function action() 
    { 
     if(isset($_POST)) 
     { 
      $this->model->someMethod($_POST['foo'],$_POST['bar']); 
     } 
    } 
} 

該模型確實是業務。

class Model 
{ 
    public function someMethod($foo,$bar) 
    { 
     // do something 
    } 
} 

視圖以某種方式知道如何與模型通信,以獲取它的當前狀態。但是它是如何完成的?

class View 
{ 
    public function action() 
    { 
     // ask the model what is going on 
    } 
} 

怎樣的看法知道發生了什麼,如果一切順利的正確方法。我雖然在模型上用'getState()'方法獲得模型的某些狀態。狀態是一些字符串視圖知道該怎麼辦但它似乎並不正確的方式給我。例如,視圖如何知道是否有人登錄?觀點是否應該真正瞭解這一點?

+0

我有一種感覺,這取決於你正在使用的MVC框架/架構? PHP本身不這樣做 – Luke

+0

沒有框架,不知道這是如何完成的。 – John

+0

PHP本身並不這樣做我相信,如果我錯了,請糾正我。您可以使任何類與PHP互相交互,我想可以通過許多不同的方式實現。如果你想在PHP中使用MVC,你將不得不採用像CodeIgnitor,CakePHP等現有框架[見這裏](http://jonathanmh.com/best-php-mvc-frameworks-of-2013/) – Luke

回答

2

有意思的是,您可以在GoF's book中查看MVC模式的簡要說明,或者查看關於SmallTalk中的模式的original article,您將看到該控制器控制用戶與視圖的交互。

視圖通常直接訂閱模型更改。您可以對同一模型有多個視圖,並且每個視圖都反映了模型更改,而無需任何控制器。

控制器是附加到特定視圖以處理用戶未輸入並將其轉換爲更高級別抽象(即意圖更新模型中的某些內容,或將消息傳遞給子視圖或其他內容的東西) 。

在GUI中,視圖通常是使用Observer模式的某些實現訂閱到的模型。在PHP中,它沒有多大意義,因爲所有東西都是通過請求呈現的(通常在請求之間沒有共享狀態),因此視圖只能查詢模型上的方法。

1

如果你想探索MVC和MVC風格的模式,你應該先閱讀GUI ArchitectureMartin Fowler。考慮一下你的強制性文獻。


在傳統的MVC模式中,視圖觀察模型層的狀態變化。這種方法在PHP中並不可行。您仍然可以嘗試應用它,但由於額外的複雜性,這些好處將變得相形見絀。

還有其他的方法。

Model2的MVC(或俗稱的 「Web MVC」)擺脫了觀察員。由於在Web應用程序中,您擁有簡單的請求響應工作流程,並且由於控制器和視圖自然會形成對,因此您可以利用它。當您知道哪個控制器將用於更改模型狀態時,您同時還可以獲得有關哪個視圖將用於響應的信息。

這意味着,不是在觀察者上中繼,而是已經看到知道模型層的哪些部分可以被改變並請求信息。

不同的方法被稱爲MVP。爲了探索這一點,如果你閱讀模式的定義publication,你會更好。

相關問題