2012-04-10 70 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

相关问题