2011-07-10 40 views
1

Circumflex framework塊,你可以映射一個URL到塊這樣的:斯卡拉:生成有條件地運行另一個塊

get("/foo") = { 
    "hello, world!" 
} 

其中,瀏覽到/foo時,將顯示給定的字符串如預期。現在,要編寫完整的Web應用程序,您幾乎總是需要某種形式的身份驗證和授權。我試着寫某種包裝的上述構建的,因此我可以這樣寫:

get("/foo") = requireLogin { 
    "hello, world!" 
} 

requireLogin方法將隨後檢查用戶登錄,如果是,執行給定的塊。但是,如果沒有,它應該重定向到登錄頁面。

現在我無法獲得正確的語法(我仍然是一個Scala新手)。你如何以通用的方式來做到這一點?

回答

4

嘗試這樣:

def executeMaybe[A](work: => A): Option[A] = 
    if (util.Random.nextBoolean) 
    Some(work) 
    else 
    None 

此執行與概率0.5傳遞的代碼,返回Some(<result delivered by work>),或返回None是其他情況。你可以把它無論是這樣的:

val v = executeMaybe(42) 

或塊符號:

val v = executeMaybe { 
    // do some work 
    // provide return value 
} 

訣竅是使用按名稱參數,由=>符號信號。閱讀更多內容這裏:http://daily-scala.blogspot.com/2009/12/by-name-parameter-to-function.html

3

我問的方式,讓 - 菲利普的答案是正確的。 但這裏的以抑揚特定的一些信息:

在抑揚RequestRouter,下面就可以被用來實現所需的方法:

def requireLogin (f: => RouteResponse): RouteResponse = { 
    if(loggedIn) { 
     return f 
    } 
    else { 
     return sendRedirect("/login") 
    } 
} 

這背後的原因是越來越清晰與讓 - 菲利普的提示回答,並且一旦我記得以下調用不是將某個塊分配給某些內部數據,而是將其映射到另一個方法調用。

因此,呼叫

get("/") = {...} 

實際上映射到這一點:

get.update("/", {...}) 

塊傳遞中作爲一個通過名字參數,所以requireLogin返回值必須是相同的 - 對於Circumflex來說,它是RouteResponse,而不是一個函數。

-1

您還可以使用j2ee容器驗證與<login-config><security-constraint>東西內web.xml