2013-07-25 135 views
1

我使用Play Framework 2並希望在使用表單和驗證時儘量減少代碼重複。驗證失敗後呈現表單

我控制器呈現形式和處理表單提交:

def create() = Action { implicit request => 
    //create form 
    //DB calls to build comboboxes and tables 
    Ok(views.html.create(form, ...)) 
} 

def handleCreate() = Action { implicit request => 
    createForm.bindFromRequest().fold(
    formWithErrors => { 
     //DB calls to build comboboxes and tables 
     BadRequest(views.html.create(formWithErrors, ...)) 
    }, 
    obj => { 
     //other logic 
    }) 
} 

的問題是在//DB calls to build comboboxes and tables一部分。我不想重複這部分。當然,我可以將它提取到方法中,然後在createhandleCreate方法中調用它。

處理這段代碼是否更優雅?

謝謝!

回答

1

這是兩個獨立的HTTP調用,由於Playframework是無狀態的,因此沒有直接的方式將數據存儲在綁定到同一客戶端的服務器端「會話」中(除非您自己實現類似的功能)。

但是你可以做的是在數據庫調用周圍使用Play Cache API,確保數據是不可變的,然後使用緩存數據如果第二次調用到達時它仍然在緩存中,並避免額外的數據庫調用這種方式。這樣,它可能可以由多個客戶端共享,具體取決於您從數據庫讀出的數據的普遍程度。

+0

對於這種情況,是否有任何一種最佳實踐?像DAO這樣的東西? – 1esha

+0

我會依靠常識而不是最佳實踐。如果你的應用程序有DAO,那麼這可能是一個緩存的好地方,但它很大程度上取決於你的用例,可能肯定會出現一些情況,你需要對控制器中的數據庫中的數據進行一些昂貴的映射/合併/在這種情況下,將緩存邏輯放置在控制器中會更好。或者將這個組合邏輯和緩存提取到一個單獨的類中。 – johanandren