2011-11-04 44 views
0

我在我的應用程序中使用了MVC模式。MVC模式(需要模型中的視圖對象)

現在我需要模型中的視圖對象。

我不想添加視圖作爲我的功能在模型中的參數(因爲我也需要它在其他功能)。我不想繼續傳遞它。

應該添加視圖作爲模型的構造函數的屬性?

還有別的辦法嗎?我不應該首先需要模型中的視圖對象嗎?

這樣做的首選方式是什麼?

例子:

控制器

function someAction() 
{ 
    $somemodel->add(); 
} 

型號

class SomeModel() 
{ 
    function add() 
    { 
     if ($view->user) { 
      // do stuff 
      $this->mail(); 
     } else { 
      // do other stuff 
     } 
    } 

    function mail() 
    { 
     Mailer::send($view->user->email, $this->getitems(), $view->layout); 
    } 

    function getitems() 
    { 
     return Items::getitems($view->user); 
    } 
} 
+1

你能描述一下問題,而不是你正在努力工作的解決方案嗎?由於MVC應該將視圖從模型(和控制器)中分離出來,似乎可能有更好的方法。 –

+0

@MartinBean:我需要訪問我的模型中的視圖變量。以上不是解決方案,而是問題所在。 – PeeHaa

+1

爲什麼你想要訪問你的模型中的視圖變量?這味道對我來說就像是某種東西不在它的位置...... – maraspin

回答

5

如果你真的做的MVC模式,你將不再需要的視圖模型,因爲只有控制器才能訪問視圖。

看看你提供的代碼,我可以告訴一件事:add()方法不應該以任何方式引用$view(即使訪問它的屬性)。相反,該模型應提供來自控制器的$view->user值。 mail()方法也是如此。

考慮修復這些問題。否則,你以後會陷入更糟糕的境地。

+0

聲音忠告,我完全第二。你的模型實體就是你傳遞的東西。恕我直言,視圖對象應該被視爲您想要顯示的所有項目的存儲庫。除此之外的其他內容不得用於所有其他目的。只是我的2cc。 – maraspin

1

模型應該與視圖分開。所以,正如mkArtak所說,控制器應該是唯一與視圖進行通信的東西。然後只將必要的信息傳遞給模型。

至於模型,它應該只處理它理解的信息。

即,如果你有一個汽車模型......你不想建立它依賴於它的工廠。如果你這樣做了,如果你想在不同的工廠建立它,你將不得不改變你的代碼。

1

控制器是您'烘烤'所有準備渲染的地方。通過烤我的意思是你認爲任何傳遞$ _REQUEST參數,進行模型API調用來獲取你需要的數據,並設置模板變量來呈現。在這個過程結束時,你的動作應該調用一個你選擇的模板(視圖)來渲染「烘焙的」模板變量。