2011-12-11 14 views
0

我想在MVC體系結構中編程。我應該對此有一個看法嗎?是2觀點好嗎?

所以,我有一個HTML表單,用戶可以插入一個電影。我有一個控制器(用於添加該電影)和一個HTML窗體視圖。

但我也希望用戶能夠在添加它後編輯該電影。所以,他按了一個按鈕「編輯電影」,他被重定向到了新的URL,並且我有了新的控制器和新的視圖(它與用戶添加電影時具有相同的形式,但是現在他只能看到他輸入的值以前,我希望你明白我的意思)這個編輯表單。另外,當我想要展示他的電影如何看起來像其他用戶,我再次有新的控制器和新的視圖。

編輯:我也必須驗證他輸入的內容。那麼,驗證應該在模型中?因爲我驗證兩次,這看起來不正確。

是否正確思考MVC?或者做這個最好的方法是什麼?謝謝。

+0

我認爲你將有一個控制器('Movie'),以及創建一個條目如果尚未創建,或可能'添加(一個'保存()'方法)和' 'edit()'指向該控制器上的'save()'方法。現在有兩種觀點,我不認爲這是一個問題。我的設計不會太聰明。 –

回答

1

你明白了,但仍然有一些地方可以簡化它。通常的做法是在控制器內部創建動作函數,以處理用戶可以執行的某些(驚喜,驚喜)動作。通常你會有,例如,Article controller與行動add,remove,edit等這樣你集中您的應用程序的公共實體的行動,並防止控制器溢出。維護起來更容易,如果你想盡快改變某些東西,你會很容易找到,你會很好地遵循DRY principle

你可以做的另一件事是創建abstract base controller用於多個控制器(從數據庫動態加載元數據記住)的常用東西。

有多個視圖是好的。無論如何,你沒有多少選擇。但我建議使用一些模板引擎,這會讓你的生活更輕鬆,並再次強迫你不要重複自己。 TwigSmarty將是最佳選擇。

驗證邏輯應位於模型中。 Model負責大部分後端邏輯(數據處理,驗證......)。 Controllers只是請求,從Models加載適當的數據,並指出你適當的View。不要混淆,但通常最終會在Controller(例如,調用validate()函數)內驗證您的Models

無論如何,最終你會發現如何看待MVC模式的方法很多。有些人更喜歡「胖模特」和「瘦身控制者」,反之亦然。使用任何適合您的需求,並保持簡單!

如果你想要一些學習材料,看看Symfony2 frameworkCakePHP教程。有關於這個主題的一些有價值的信息。也許你會最終使用其中的一種,而不是重新發明輪子:)

1

不,它太複雜了。

你不需要不同的控制器來做另一個你想做的事情。例如。如果您有用於創建電影的控制器,則不需要單獨的控制器來編輯它。您需要單獨操作,而不是控制器

基本上你應該僱用DRY(Don't-Repeat-Yourself)規則。如果視圖僅取值與form的動作不同,則僅對兩個動作(創建&編輯)使用一個視圖。查看應該爲這兩個操作生成類似的代碼 - 其中一個將沒有填充表單字段,form的操作設置爲例如。 「movies/create」,第二個將預填充表格字段form的行爲設置爲例如。 「movies/<movie_ID_here>/update」(命名約定取決於你)。

驗證應在模型,但對於用戶爲額外的幫助,你也可以驗證它在客戶端,使用JavaScript或HTML5(取決於你想要的),所以他們並不需要提交表格知道他們忘了什麼。

1

使用典型的項目佈局對我來說,我可能有類似以下內容:

Controllers 
| | 
| - MoviesController.php 
| 
Models 
| | 
| - Movie.php 
Views 
| | 
| - Movies 
| |- Create.php 
| |- Edit.php 
| - Partials 
| |- _MovieForm.php 

MoviesController包含兩個行動 - Create()Edit($id),它們各自擁有的意見。我個人有一個第三個動作爲好,這從兩個動作處理表單的提交:

public function Save() 
{ 
    //...snip... 
} 

Create()簡單地加載相應的視圖。 Edit()略有不同,因爲它在將數據傳遞到視圖之前,首先使用我們的模型從數據庫中檢索現有記錄。

這兩個視圖有一個嵌套的「部分」,這是一個常用的HTML片段 - 在這種情況下,_MovieForm.php,它有我們的表單輸入(它能夠顯示傳入的值)。

表單還包含我們行ID的隱藏輸入字段。只有在我們調用Edit()操作時纔會給出這個值。

表單提交給MoviesController的Save()方法,該方法檢查我們是否有傳遞的行ID。如果是這樣,從數據庫中獲取我們的行(再次,由我們的模型表示),更新這些值,然後調用我們的模型的方法Save()Model::Save()在我們的數據上運行我們的驗證邏輯,並保存到數據庫,或者將數據和驗證錯誤消息一起傳回到視圖。

希望這有助於:)

相關問題