2012-02-12 46 views
9

我正在學習CodeIgniter及其軟件模式。應該首先創建哪個視圖或控制器?MVC模式:需要先創建什麼?

+1

一般來說,我同意@Shiplu的問題太寬泛。不過,我認爲它實際上帶來了一些積極的答案,所以這只是一次有用。我建議路人查看一下提供的不同答案。 – rdlowrey 2012-02-12 15:54:01

+0

不同答案的數量很有趣。所以我覺得很好的問題。我個人認爲這很大程度上取決於項目的簡單性和團隊中的資源數量。我認爲很多單一開發人員會將工作速度加快,以便進行建模。在一些公司中,規格將是線框或HTML。我懷疑是否有適合所有正確的答案。 – Gavin 2012-09-30 13:24:44

回答

11

模型因爲這是你的應用程序。控制器和視圖僅形成一個模型接口。人們可以說,控制器是你家門口。你先建什麼?門或房子?對,所以先建立模型。然後添加一個接口。

+0

+1這就是我們'一般'工作的方式,我認爲它會導致更好的模型/ API,並幫助TDD。有時候,我們會打破流程,儘量減少工作量,通常在我們的要求不明確或者利益相關者過度參與和示範時。它還允許多個開發人員/設計人員更容易地將待辦事項列表分開,即backend/ui。 – Gavin 2012-09-30 13:21:50

0

控制器,你需要它在模型和視圖之間進行通信。 沒有控制器,模型不能與視圖進行交互。

1

控制器是必須的。因爲你不能在沒有控制器的情況下執行/完成工作。所以控制器至上以下的,因爲

  1. 您可以禁用的觀點,必要時
  2. 您可以通過控制設置相關的變量到視圖
  3. 與模型的相互作用是由控制器這樣做,所以當你需要控制器先來的數據
  4. 您可以將用戶重定向到其他控制器
  5. 您可以根據請求顯示其他視圖。對於計算機視圖A,對於移動設備視圖B,就像明智的
  6. 視圖是演示文稿,所以首先需要數據才能呈現。
7

我總是開始於查看。情景是,我已經設計了我的數據庫,選擇了技術。這是我在MVC模式上的工作流程。

  1. 創建CSS /圖像等
  2. 根據對視圖創建控制器方法時所顯示的數據的HTML模板。
  3. 我把控制器方法中的虛擬數據,以便我可以看到一個動態頁面,正確操縱視圖。
  4. 根據我的控制器需要的數據我創建了模型方法。

在這個過程中,我從不創建任何額外的方法或代碼塊。它防止添加我們通常認爲「可能是必需的」的代碼。但他們從不需要。

通過這種方式,您首先創建規範然後在每個步驟上實現它。所以它就像View一樣爲它創建數據需求。控制器提供它。併爲Model創建數據規範。最後,Model只提供被調用或需要的數據。

+0

小心解釋減投票? – 2012-02-12 15:58:55

+0

+1這是一個完全有效的自上而下的方法。當前期邏輯規範或模型設計缺失/不被認爲是有效使用努力時,肯定會工作得很好。這完全取決於環境和質量保證要求。對於許多應用程序來說,沒有什麼可以更容易或更快,然後自上而下。 – Gavin 2012-09-30 13:14:50

+0

+1在過去,當我們使用記事本來預先靜態頁面時,我們都使用了設計第一次評估。在過去,它非常有意義,儘管它可能非常基於個人選擇。我相信如果你正在自己開發一個項目,這是一個完美的感覺。 – 2016-08-23 09:25:13

0

我會說模型和控制器手拉手。

沒有模型,你將如何知道控制器中的流程是什麼?

沒有控制器,你怎麼知道模型需要什麼方法?

有時候,模型會得到優先級,有時控制器會根據情況而定。

1

雖然這個問題已經有了一個可接受的答案,但我想從可測試性的角度提供一種方法。現成的框架通常不設計他們的控制器考慮到可測性,所以這種問題一遍又一遍地出現。

甲寫得很好,可測試控制器應該採取的視圖作爲通過控制器的__construct方法注入的依賴性。不過,我不知道CodeIgniter控制器是否支持這種功能。

在MVC範例中,Controller將視圖和模型的元素「彙集在一起​​」,因此,就像任何行爲依賴關係一樣,如果這些對象提供除「啞」數據存儲之外的任何功能,則應將其注入到控制器在實例化時,可以將它們模擬出來用於測試目的。所以,你會做類似如下:

$view = new SmartyView; 
$model = new UserModel; 
$controller = new LoginController($view, $model); 

通常情況下,模型不提供任何公開的「行爲」的方法,並作爲基本的數據存儲實體。如果是這樣的情況下,出於同樣的原因,你並不需要注入的陣列到控制器中創建新的數組,你可以安全地創建控制器內的新模型實例在不犧牲可測性:

class LoginController 
{ 
    protected $view; 

    public function __construct(ViewInterface $view) 
    { 
    $this->view = $view; 
    } 
    public function doLogin($user, $pass) 
    { 
    $userModel = new UserModel(); 
    // do stuff with model to determine if user/pass was valid 
    } 
} 

$view = new SmartyView; 
$controller = new LoginController($view); 

爲了可測試性,最好的做法是避免將控制器與視圖和模型緊密耦合。這就是爲什麼你通常應該避免在你的控制器代碼中使用new關鍵字。您的控制器 - 以及其他任何對象 - 對於它們的依賴關係應爲ASK,而不是LOOK。這將導致更透明的API,更多的可測試代碼,更少的調試麻煩和更快樂的你。

+0

這部分讓我困惑了一下。在請求生命週期中,您最終會如何向控制檯提供相關信息? 一般來說,路由器/調度員確實喜歡 一個非常簡單的調用'$爲route->設置( '/ URI /到/匹配', 'ControllerName', 'controllerAction');' 你描述是一個在大型項目中編寫代碼非常繁瑣的工作,其中涉及將一些匿名函數應用於路由器/調度程序,然後在將它們傳遞給控制器​​之前處理這些實例。如果一個模型依賴於其他模型呢? – AgmLauncher 2013-10-21 08:59:46

0

我知道這可能是個老問題,但我現在碰到它了。
其他人可能稍後需要它。所以我決定總結一下。
我認爲你的方法將取決於情況。
讓你做操作的順序是這樣模型 - 視圖 - 控制器
並讓叫它底部到頂部方法。這種情況和推理由@Gordon here提供。
而另一個案例讓我們稱它爲從上到下,當你開始用戶界面。這種情況和推理由@ shiplu.mokadd.im here提供。
評估你自己的案例,並選擇其中一個。祝你好運!

相關問題