2013-07-17 24 views
1

在理想世界中,不應該依賴單例,視圖內控制器和模型中的模型應該是2個不同的實例。當控制器設置狀態並且視圖呈現取決於該狀態時,問題就出現了。例如:PHP:MVC中的模型應該作爲單例實現嗎?

class MyController extends Controller { 

    public function __construct(ModelUsers $cModel) 
    { 
     $this->model = $cModel; 
    } 

    public function action_Search($username) { 
     $this->model->filterByUsername($username); 
    } 
    } 

    class MyView extends View { 

    public function __construct(ModelUsers $vModel) 
    { 
     $this->model = $vModel; 
    } 

    public function users() { 
     return $this->model->getUsers(); 
    } 
    } 

如何在控制器模型和視圖模型之間共享數據?

+0

爲什麼單身人士會不好? – Virus721

+0

這不是一個「模型」。模型是一個圖層,圖層不能是單身人士。同樣,沒有控制器模型或視圖模型。有關更多詳細信息,請參閱http://stackoverflow.com/questions/3499336/in-mvc-where-do-you-draw-the-line-between-a-controller-and-model/3501048#3501048。 – Gordon

+2

@ Virus721因爲http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323 – Gordon

回答

0

您可以使用註冊表而不是依賴注入

此外在某些情況下,您可能會傳遞一些數據到您的視圖類作爲數組。就像這樣:

class MyView extends View { 
    private $data = array(); 

    public function __construct($data) 
    { 
     $this->data = $data; 
    } 

    public function users() { 
     return $this->data['model']->getUsers(); 
    } 
    } 

當然,你必須通過模型時,你從你的控制器(或任何你撥打電話)caling的View類。

2

從基礎

視圖從模型請求,它需要以生成輸出表示給用戶的信息開始。

這意味着視圖應該只負責顯示信息。只是爲了那個。你也可以做一些事情,如修剪,鏈接文字大小等,但你不應該做一些計數或更復雜的操作。

A model當狀態發生變化時通知其相關的視圖和控制器。該通知允許視圖產生更新的輸出,並且控制器更改可用的命令組。

模型應該負責數據操作。您可以使用它來從數據庫中獲取記錄。它只是負責數據處理。

控制器可以發送命令到它的相關聯的視圖改變視圖的模型的介紹(例如,通過經由一個文檔滾動)。它還可以向模型發送命令以更新模型的狀態(例如,編輯文檔)。

控制器是一種模型和視圖之間的代理。你得到了參數,根據這個參數你設置了你的控制器的適當動作。這個動作應該創建正確的模型對象並使用它來獲取數據然後分配給視圖。

我從來沒有在模型中使用單例。如果你需要一些能夠幫助MVC結構的類,你可以使用助手並且像Hast建議的註冊表這樣的模式。我不喜歡使用單身人士。

您可能也想看看When to use singleton

所以你的問題。

  • 的Controler - >模式=通過模型的方法的參數傳遞數據
  • 型號 - > CONTROLER =如果引用然後就進行這項工作,如果參數,那麼做一些事情,並返回結果
  • 的Controler - >查看=分配適當的數據進行查看。
  • View-> controller =轉到特殊的url來創建數據或使用ajax請求來檢索它。
相關問題