这是从 Play Framework 附带的示例中提取的动作组合
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
所以,Security.Authenticated
取一个username: RequestHeader => Option[String]
和onAuthorized: RequestHeader=>SimpleResult
第二组括号取String => Action[A]
然后在控制器中我有:
def index = isAuthenticated { ...code }}
上面的代码是这样的,所以我假设这是f
函数=> String => Request[AnyContent] => Result
。现在,我不明白这里到底发生了什么。我不是在谈论User.findByEmail....
,我是在谈论username => _ => ...
。如果我直接调用这个函数的签名会是什么样子?
username => _ =>
User.findByEmail(username).map { user =>
Ok(
html.dashboard(
Project.findInvolving(username),
Task.findTodoInvolving(username),
user
)
)
}.getOrElse(Forbidden)
如果有def isAuthenticated(f: => Request[AnyContent] => Result)
我会知道如何使用它,我会理解它。但是额外的“数据”让我感到困惑。
更新:
我想我发现了一些东西:
def f2: String => Int => List[Char] = x => _ => x.toList
这将被称为:
f2("Andrew")(2) //there can be anything replacing 2 because I don't have access to it anyway
因此,我主要询问的上述功能将是:
def f: => String => Request[AnyContent] => Result = username => _ => User.find.....
我对吗?
我收到“此处不允许使用名称参数错误”。
如果他们不使用第二个参数,他们为什么要使用String => Request => Result
而不是简单地使用String => Result
?