2010-05-09 60 views
2

我想了解MVC模式。這就是我認爲MV是:什麼是PHP中的MVC的例子?

型號:

<?php 
if($a == 2){ 
    $variable = 'two'; 
} 
else{ 
    $variable = 'not two'; 
} 
$this->output->addContent($variable); 
$this->output->displayContent(); 
?> 

查看:

<?php 

class output{ 

    private $content; 

    public function addContent($var){ 
     $this->content = 'The variable is '.$var; 
    } 

    public function displayContent(){ 
     include 'header.php'; 
     echo $content; 
     include 'footer.php'; 
    } 

} 
?> 

這是正確的?如果是這樣,控制器是什麼?

+0

看起來更像是你的模型實際上是一個控制器。模型通常處理業務對象及其關聯的邏輯(通常是數據庫行以及能夠使用它的操作)。 – 2010-05-09 00:53:37

+0

這不是真正的MVC概念 - 我推薦通過一個示例實現(如http://codeigniter.com/user_guide/)閱讀,以更好地瞭解MVC如何在PHP中實現。 – 2010-05-09 00:54:21

回答

1

控制器接收用戶請求 - 通常有某種路由器需要一個URL並將請求路由到適當的控制器方法。

控制器使用模型來向/從數據庫(或其他數據源)查詢數據。

從控制器調用視圖來呈現實際的HTML輸出。

2

控制器是你的邏輯,模型是你的數據,視圖是你的輸出。

那麼,這是控制器:

$model = new UserDB(); 
$user = $model->getUser("Chacha102"); 
$view = new UserPage($user->getName(), $user->getEmail()); 

echo $view->getHTML(); 

的模型是userDB的類,它會給我我的數據。該視圖是我從模型中提供數據的UserPage,然後它將輸出該頁面。

正如你所看到的,控制器在這個例子中沒有做太多的工作,因爲你只是獲取用戶數據並顯示它。這是MVC的美麗。控制器不必處理用戶SQL或HTML的東西,它只是抓取數據並將其傳遞給視圖。

此外,視圖並不知道模型的任何內容,模型也不知道視圖的任何內容。因此,你可以有機會執行任何一個,也不會影響其他。


更多有關你的例子,你認爲是正確的,但你有混合控制器和型號。

您可以通過緩解這樣的:

控制器:

$model = new NumberToWord(); 
$word = $model->getWord($a); 
$this->output->addContent($word); 
$this->output->displayContent(); 

型號:

class NumberToWord{ 
    public function getWord($number) 
    { 
     if($number == 2){ 
      return 'two'; 
     } 
     else{ 
      return 'not two'; 
     } 
    } 
} 

,並保持你相同的輸出

+0

爲了進一步說明,視圖通常非常簡單。在這種情況下,'getHTML()'可能就是這樣的:'return「 ... $ user,$ email ...」;'。控制器是你的大部分PHP代碼可能會去的地方。您的html/css/js將進入視圖。你的模型將是簡單的數據容器(通常)。 – 2010-05-09 00:58:00

+0

你們中的任何一個人都可以評論ajax可能適合所有這些嗎?或者MVC不是Ajax的好選擇? – Cam 2010-05-09 01:02:42

+0

因此,模型基本上是對象,控制器充當模型和視圖的中介。 – waiwai933 2010-05-09 01:02:44

1

如果你想要做的就是創建一個簡單的模板系統,你可能會去:

$content = 'blaba'; 
$tpl = file_get_contents('tpl.html'); 
echo str_replace('{content}',$content,$tpl); 

與模板文件,如:

<html> 
<head><title>Whatever</title></head> 
<body>{content}</body> 
</html> 
0

Zend Framework: Surviving The Deep End有一些很好的解釋部分MVC。看看MCV Intro,特別是the model這個部分。

有模型的許多解釋,但對於很多程序員模型被等同於數據訪問,誤解大多數框架不經意間沒有明顯的承認,他們不提供完整的模式推廣。在我們的流行語被淹沒的社區中,許多框架將模型的定義留在文檔中不清楚和模糊。

要回答「哪來的控制器」:

控制器只能在這個意義上定義應用程序的行爲,他們繪製從UI輸入到模型中調用和處理客戶的互動,但除此之外作用呢應清楚模型中包含的所有其他應用程序邏輯。控制器是用最少的代碼卑微的生物誰只是搭建了舞臺,讓事情以有組織的方式工作,爲應用程序的運行環境。

我想你就會發現這(和他的其他文章和書籍引用)很好的閱讀。

1

在你的例子中,更像是你已經將一個Controller分成一個Model和一個View。

  • 型號:商業邏輯/規則和通常某種數據庫的到對象關係映射
  • 控制器:響應是適當的模型(或多個)和視圖(S)拉到一起向URL請求建立一個輸出。
  • 查看:輸出將採取的視覺結構。通常是一個「啞」組件。

它可以是混亂,當你第一次遇到MVC架構的web應用程序,主要是因爲大部分Web框架都沒有MVC可言,卻承擔着更密切的相似之處PAC。換句話說,模型和視圖不會說話,而是由Controller根據給定請求理解的上下文拉到一起的兩個元素。看看拉里·加菲爾德對這個問題的優秀評論瞭解更多信息:

http://www.garfieldtech.com/blog/mvc-vs-pac

另外,如果你有興趣發展的MVC模式,我建議你下載了很多框架中的一個,並通過教程運行或二。 Kohana,CodeIgnitor,CakePHP和Zend應該足以啓動Google-a-thon!