我正在學習CodeIgniter及其軟件模式。應該首先創建哪個視圖或控制器?MVC模式:需要先創建什麼?
回答
該模型因爲這是你的應用程序。控制器和視圖僅形成一個模型接口。人們可以說,控制器是你家門口。你先建什麼?門或房子?對,所以先建立模型。然後添加一個接口。
+1這就是我們'一般'工作的方式,我認爲它會導致更好的模型/ API,並幫助TDD。有時候,我們會打破流程,儘量減少工作量,通常在我們的要求不明確或者利益相關者過度參與和示範時。它還允許多個開發人員/設計人員更容易地將待辦事項列表分開,即backend/ui。 – Gavin 2012-09-30 13:21:50
控制器,你需要它在模型和視圖之間進行通信。 沒有控制器,模型不能與視圖進行交互。
你應該從控制器開始,因爲它正在調用View。
在這裏您可以看到Controller在Model和View之間。 http://codeigniter.com/user_guide/overview/mvc.html
控制器是必須的。因爲你不能在沒有控制器的情況下執行/完成工作。所以控制器至上以下的,因爲
- 您可以禁用的觀點,必要時
- 您可以通過控制設置相關的變量到視圖
- 與模型的相互作用是由控制器這樣做,所以當你需要控制器先來的數據
- 您可以將用戶重定向到其他控制器
- 您可以根據請求顯示其他視圖。對於計算機視圖A,對於移動設備視圖B,就像明智的
- 視圖是演示文稿,所以首先需要數據才能呈現。
我總是開始於查看。情景是,我已經設計了我的數據庫,選擇了技術。這是我在MVC模式上的工作流程。
- 創建CSS /圖像等
- 根據對視圖創建控制器方法時所顯示的數據的HTML模板。
- 我把控制器方法中的虛擬數據,以便我可以看到一個動態頁面,正確操縱視圖。
- 根據我的控制器需要的數據我創建了模型方法。
在這個過程中,我從不創建任何額外的方法或代碼塊。它防止添加我們通常認爲「可能是必需的」的代碼。但他們從不需要。
通過這種方式,您首先創建規範然後在每個步驟上實現它。所以它就像View一樣爲它創建數據需求。控制器提供它。併爲Model創建數據規範。最後,Model只提供被調用或需要的數據。
小心解釋減投票? – 2012-02-12 15:58:55
+1這是一個完全有效的自上而下的方法。當前期邏輯規範或模型設計缺失/不被認爲是有效使用努力時,肯定會工作得很好。這完全取決於環境和質量保證要求。對於許多應用程序來說,沒有什麼可以更容易或更快,然後自上而下。 – Gavin 2012-09-30 13:14:50
+1在過去,當我們使用記事本來預先靜態頁面時,我們都使用了設計第一次評估。在過去,它非常有意義,儘管它可能非常基於個人選擇。我相信如果你正在自己開發一個項目,這是一個完美的感覺。 – 2016-08-23 09:25:13
我會說模型和控制器手拉手。
沒有模型,你將如何知道控制器中的流程是什麼?
沒有控制器,你怎麼知道模型需要什麼方法?
有時候,模型會得到優先級,有時控制器會根據情況而定。
雖然這個問題已經有了一個可接受的答案,但我想從可測試性的角度提供一種方法。現成的框架通常不設計他們的控制器考慮到可測性,所以這種問題一遍又一遍地出現。
甲寫得很好,可測試控制器應該採取的視圖作爲通過控制器的__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,更多的可測試代碼,更少的調試麻煩和更快樂的你。
這部分讓我困惑了一下。在請求生命週期中,您最終會如何向控制檯提供相關信息? 一般來說,路由器/調度員確實喜歡 一個非常簡單的調用'$爲route->設置( '/ URI /到/匹配', 'ControllerName', 'controllerAction');' 你描述是一個在大型項目中編寫代碼非常繁瑣的工作,其中涉及將一些匿名函數應用於路由器/調度程序,然後在將它們傳遞給控制器之前處理這些實例。如果一個模型依賴於其他模型呢? – AgmLauncher 2013-10-21 08:59:46
- 1. JPA2/Hibernate - 動態創建模式(即不需要手動預先創建模式)?
- 2. 我需要什麼來創建這個交互式3D模型?
- 3. 爲什麼創建虛擬表需要OPEN_READWRITE模式?
- 4. MVC根據需要創建對象的接口的模式/庫
- 5. Symfony - 創建插件需要什麼?
- 6. 爲什麼需要使用OnModelCreating(首先是MVC 5 EF代碼)?
- 7. 爲什麼我們需要創建模擬對象?
- 8. 爲什麼在創建模型表單時需要「類Meta」?
- 9. 我需要知道什麼來創建Xcode項目模板?
- 10. 爲什麼首先需要GUID屬性?
- 11. 分配給模型的創建/新視圖需要mvc建議?
- 12. 爲什麼要創建模擬對象?
- 13. 我們什麼時候需要創建代理服務,什麼時候需要創建Rest Api?
- 14. siebel需要什麼建議?
- 15. 多租戶 - 預先創建表或根據需要創建表?
- 16. 創建模式的目的是什麼
- 17. MVC 2需要什麼版本的.net?
- 18. 只有Spring-MVC需要什麼jar包?
- 19. 首先要學習什麼創建聊天室?
- 20. 爲什麼代碼首先要創建索引列?
- 21. MVC倉庫模式:創建模型類
- 22. 爲什麼我需要IIS7中的ASP.NET MVC中的「經典模式」?
- 23. 創建模板和編輯模板需要不同的MVC模板?
- 24. 我需要在MVC模型的代碼首先
- 25. 什麼是MVC模式的模型
- 26. 什麼是MVC模式中的「模型」?
- 27. 會有什麼的正則表達式我需要的模式
- 28. 創建工廠需要節點模塊
- 29. 爲什麼要優先
- 30. 爲什麼我需要在創建新模型時指定名稱?
一般來說,我同意@Shiplu的問題太寬泛。不過,我認爲它實際上帶來了一些積極的答案,所以這只是一次有用。我建議路人查看一下提供的不同答案。 – rdlowrey 2012-02-12 15:54:01
不同答案的數量很有趣。所以我覺得很好的問題。我個人認爲這很大程度上取決於項目的簡單性和團隊中的資源數量。我認爲很多單一開發人員會將工作速度加快,以便進行建模。在一些公司中,規格將是線框或HTML。我懷疑是否有適合所有正確的答案。 – Gavin 2012-09-30 13:24:44