2012-04-10 52 views
3

我有一個具有複雜的參數類型IsAuthenticated方法(我從play2的zentasks例如複製它):如何重構IsAuthenticated`的`的方法,以提供更好的API

def IsAuthenticated(f: => String => Request[AnyContent] => Result): Action[(Action[AnyContent], AnyContent)] = 
    Security.Authenticated(username, onUnauthorized) { userId => 
    Action { implicit request => 
     val email = request.session("user.email") 
     f(email)(request) 
    } 
    } 

爲了使用它,我的動作是:

def delete(id:String) = IsAuthenticated { email => request => 
    ... 
} 

你可以看到我必須聲明email事件,如果我不需要使用它。我可以用_代替:

def delete(id:String) = IsAuthenticated { _ => _ => 
    ... 
} 

_ => _ =>仍然是無聊。

如何重構該方法使其用法更簡單?例如如果我不需要emailrequest,我可以:

def delete(id:String) = IsAuthenticated { 
    ... 
} 

如果我只需要request,我可以:

def delete(id:String) = IsAuthenticated { request => 
    ... 
} 

如果我需要email,然後我宣佈他們都:

def delete(id:String) = IsAuthenticated { email => request => 
    ... 
} 

回答

4

您可以重載IsAuthenticated以提供您所需的不同口味。例如:

def IsAuthenticated(result: => Result) = IsAuthenticated { _ => _ => result } 

然後可以使用,如下所示:

def delete(id:String) = IsAuthenticated { 
    ... 
} 
+0

對不起,編譯錯誤:'雙定義:方法IsAuthenticated:(F:=> play.api.mvc.Result)玩.api.mvc.Action [(play.api.mvc.Action [play.api.mvc.AnyContent],play.api.mvc.AnyContent)]和方法IsAuthenticated:(f:=> models.SessionUser => play。 api.mvc.Request [play.api.mvc.AnyContent] => play.api.mvc.Result)play.api.mvc.Action [(play.api.mvc.Action [play.api.mvc.AnyContent], (f:Function0)play.api.mvc.Action' – Freewind 2012-04-10 14:19:42

+0

將第一行的'IsAuthenticated'更改爲'def IsAuthenticated(f:String => Request [AnyContent] => Result)'(使用一個按值參數)。 – 2012-04-10 15:55:48

相關問題