2012-06-23 97 views
0

我正在設計一個試圖遵循REST規範的應用程序。我試圖找出設計它的最佳方式。MVC中的RESTful設計模式?

所以我們可以說我做一個POST調用,所以我在我的控制器中的「後」的方法和模型

// in controller 
function post() 
{ 
    //call post model here 
} 

在我的職務要求我需要做以下檢查:

-validate fields 
-make sure item name is unique for that user 
-make sure there are less than 10 items 
-etc (there could be more cases) 

現在,在控制器的功能後,我將返回基於無論發生什麼事情一個REST消息和狀態代碼,這是很好的,但我很好奇,想知道這是更好地保持所有這些檢查。

我可以把模型中的所有的檢查,然後再返回某種數組一樣的:

array('text' => 'return response text/array or whatever here', 'code' => '200/400/etc') 

然後,只需在控制器返回這一點,或者是它更好地內打破了那些檢查到各個功能模型,然後在控制器中進行所有檢查?

// in controller 
function post() 
{ 
    //if validation fails -> send response 
    //if name is not unique -> send response 
    //etc... 
} 

從設計的角度來看,如果我想有可能調用其他方法的項目模型「後」的方法,它不會有一個包羅萬象的函數來處理它,但是如果我做把它全部放在一個模型函數中,它不會給我很多可重用性。如果我不得不挑選雙方,那麼我很可能不需要重複使用這些「檢查功能」,但是在模型中而不是控制器中擁有所有響應信息似乎也很奇怪。

任何人都可以請給我一些這方面的投入。

回答

1

我不會創建模型內POST方法(雖然有它的控制器是完全沒有問題的),因爲你只要把代碼/模型等一個不可重複使用,並且可讀性較差的框架。例如,而不是模型中的post方法,我會創建create方法。

沒有一個一勞永逸的方式進行數據驗證。我喜歡創建驗證類,對於各種數據類型,只有一個方法validate(例如,用戶名驗證類檢查它是否匹配正則表達式並且是唯一的)。將複製代碼粘貼到每個動作(DRY)上會更好。在哪裏調用這個類的方法?這取決於。你可以簡單地在動作中調用它。由於驗證代碼在驗證類內部,所以它看起來沒問題。您也可以創建一個映射器,它接受請求,確定必須執行哪些驗證等,但這可能是矯枉過正並且難以正確執行(可維護性明智)。

對於再次輸出 - 乾的。這取決於你使用的是什麼MVC框架,並且可能已經有了一個很好的解決方案。如果沒有,你可以創建一個類(yup,我是DRY瘋子)。你傳遞的響應代碼,數組(或字符串)與響應和類很好地包裝成JSON,XML格式的一切。優點:如果你改變輸出格式,那麼你只需要在一個地方改變。

還要考慮使用Remote Facade模式。

希望,你發現了一些在這個職位很有用。

+0

感謝您的回覆,這給了我一些想法。我使用的是codeigniter,所以我只是將所有這些案例都加入到一個自定義的驗證類中,並且幾乎可以解決它。保持乾燥的一切,並保持我的控制器和模型清潔。 – Rob

1

我將在API從MVC應用程序分離出來,並使用Apify