我是新来斯卡拉和playframework。 可以请人翻译以下下面的代码片段简单易懂的英语? 对于其背景在这里找到: http://www.playframework.org/documentation/2.0.4/ScalaSecurity
/**
* This method shows how you could wrap the withAuth method to also fetch your user
* You will need to implement UserDAO.findOneByUsername
*/
def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
UserDAO.findOneByUsername(username).map { user =>
f(user)(request)
}.getOrElse(onUnauthorized(request))
}
第1部分:首先,让我们解决咖喱语法:
withUser
是采用一个咖喱功能的方法f
类型的User => Request[AnyContent] => Result
。 它需要一个User
对象,并返回另一个函数,接受Request
并返回一个Result
。 打破它,如果f
是函数,那么:
val g = f(user) // g is a function
val result = g(request) // returns a result
// same as:
val result = f(user)(request)
实事求是地讲f
就像它有两个参数,但一个函数,而不是调用f(a, b)
你调用f(a)(b)
withAuth
也是需要咖喱功能的方法。 它具有几乎相同的类型withUser
。
第2部分:现在,你如何使用这些方法:
正如解释在这里 ,玩耍,你告诉它如何改造定义应用程序逻辑Request
对象到Result
的对象。
withAuth
是一个辅助函数,它为您的身份验证的照顾和方便检索的用户名。 所以你使用这样的:
def index = withAuth { username => implicit request =>
Ok(html.index(username))
}
它返回一个函数,接受Request
并返回一个Result
,这是玩的需求。 但是,它需要的是一个咖喱功能(即需要用户名),并返回一个函数(即取的请求)。 请求参数被标记为隐式 ,因此它可以被隐式地传递给需要的隐式请求参数的任何功能/方法调用。 对于这种解释的目的,只是忽略了implicit
关键字。
第3部分:翻译withUser
那么,它的签名是类似withAuth
,目标是为它在相同的方式使用,除了第一个参数将是User
,而不是一个String
。 因此,必须采取一个User => Request => Result
。 请求性状需要其指示其内容的类型的类型参数。 这是AnyContent
。 因此,正确类型的参数withUser
是User => Request[AnyContent] => Result
。 这意味着你将能够使用它像这样:
withUser { user => implicit request =>
// do something with user and request to return a result
}
如果你看一下定义withUser
,它所做的是调用withAuth
:
def withUser(f: User => Request[AnyContent] => Result) = withAuth {
// ...
}
因此,这将返回相同类型withAuth
这意味着它将返回一个转动的功能Request
到一个Result
(见上面第2部分)。 这意味着我们将能够使用它像这样:
def index = withUser { user => implicit request =>
Ok(html.index(user))
}
什么作为参数传递withAuth
是咖喱功能。 我介绍了中间val
,让你可以按照类型:
username => // first param is the username as a String
implicit request => // second param is the request
// here we have to return a Result...
// we lookup the user - we may not have one:
val userOption: Option[User] = UserDAO.findOneByUsername(username)
// f is the code block that will be provided inside withUser { f }
// Part 1 explains the f(user)(request) syntax
// We call f to get a result, in the context of the Option monad
val resultOption: Option[Result] = userOption.map(user => f(user)(request))
// if we have a result, return it; otherwise return an error.
resultOption.getOrElse(onUnauthorized(request))