2014-04-27 30 views
0

我剛剛進入MVC體系結構,我試圖創建自己的非常簡單的MVC框架,我明白,只有核心功能沒有額外的我不需要。單視圖類處理所有模板

我做了一個View類,它可以處理所有視圖模板的渲染。

我的問題是,我應該爲每個視圖模板製作一個View類,而不是使用一個用於多個模板?

我沒有看到我會這樣做的原因,但我想我會問,並確定我沒有違反任何MVC原則。

class View { 
    private $_vars = []; 

    public function __set($index, $value) { 
     $this->_vars[$index] = $value; 
    } 

    function render($fileView) { 
     $path = ABSPATH . '/view/' . $fileView . 'View.php'; 

     if(!file_exists($path)) { 
      throw new Exception('View not found: '. $path); 
     } 

     foreach($this->_vars as $key => $value) { 
      $$key = $value; 
     } 

     require $path; 
} 
+0

你應該罰款與處理它。 – lagbox

+1

只是FYI:PHP有一個'extract()'函數來完成你在'foreach'循環中做的事情。 – lafor

回答

-1

您應該只創建一個類來處理框架中的模板。您可以將其聲明爲抽象類,然後創建多個更具體的視圖(如擴展抽象類的HTMLView,JSONView等)。但一般來說,你的方法是正確的。基於MVC結構,查看類應只能找到磁盤上的模板文件並將其呈現爲。所有的循環和語句應該寫在該模板文件中。

在你的情況,視圖類不應該是一個單身人士。對於正在呈現的每個模板,都應該創建一個新實例,以避免private $_vars = [];中的變量在不同的控制器中混淆。更好的方法是在View類中創建靜態方法,然後像這樣調用它:View::render($args)View::render($args, $template_name)

您可以在類似Symfony2的風格中做到這一點,因此控制器只會返回包含要在模板中分配的變量的數組(可選擇指向.tpl的路徑,但最好定義邏輯結構並強制View自動查找) 。請不要忘記回來從你的應用程序正確的響應,於是想起頭,狀態等

我強烈建議你實現一些模板引擎到你的應用程序,例如像Twig。它會讓你的生活變得更輕鬆,視覺課程將通過這種引擎開箱即用。

+0

我想如果我想做任何特定的事情,我總是可以從這個視圖類延伸。 –

+0

是的,正好;)這就是爲什麼你可以創建JSONView來創建jsons或XMLView。但View類不應該做任何特定的事情。它只應將變量傳遞給模板文件,其中發生任何其他邏輯。 –

+0

-1:你完全錯了。 **視圖不是模板** –

0

這種取決於你自己的願望和要求。我在MVC(like)框架中見過很多不同的視圖結構。您的選項包括但不限於:

  • 每頁使用一個視圖類(類Login,類EditUser)。
  • 在獨立的類(類Textbox,類Form)中包裝視圖的部分視圖,您可以使用該視圖合成較大的視圖(類Login由一個包含兩個Textbox類的類Form組成)。
  • 使用一個視圖類呈現多個模板。那麼類用戶將負責渲染ADDUSER模板和EditUser模板等

這一切都依賴於應用程序的大小和性能/資源方面希望,編程,緩解,可讀性...

+0

除了第2點:我認爲在這些類或任何其他組件中實現toString()也是一個不錯的主意。 –