我正在使用Play 2.x,并在操作处理程序中找到以下语法,例如
object Application extends Controller {
/**
* Index action handler
*/
def index = Action { implicit request =>
Ok(Json.obj("one" -> "two"))
}
}
在这里,我了解除不是函数类型的= Action
之外的所有内容,因为函数返回类型是play.api.mvc.Result
。那么= Action
是什么意思呢?
为了使理解变得更糟,我现在引入了身份验证,并根据示例将我的应用程序更改为:
object Application extends Controller with Secured {
/**
* Index action handler
*/
def index = IsAuthenticated { username => implicit request =>
Ok(Json.obj("one" -> "two"))
}
}
这有效,但为什么不再需要Action
? 有必要吗? 我如何组合这些类型中的几种(无论它们是什么意思(:Action
或DBAction
,IsAuthenticated
等?
Action
不是一个类型,它是一个函数。如果它是一种类型,则index
的签名将如下所示
def index: Action = { implicit request =>
请注意:
的添加和=
的位置
相关文档指出操作是
处理请求并生成要发送到的结果的函数 客户端
正如您注意到的那样,您正在返回play.api.mvc.Result
现在多亏了一位同事,我明白了它是什么。该语法仅表示返回一个对象,在本例中为Action
类型的对象,并且该操作将一个函数作为构造函数参数,该函数将请求作为输入并返回SimpleResult
,可以重写为例如
object Application extends Controller {
/**
* Index action handler
*/
def index : Action[AnyContent] = {
Action(implicit request => Ok(Json.obj("one" -> "two")))
}
}
实际上令人困惑的是,在 Scala 中,他们可以在括号和大括号之间切换有点模糊。因此,很难意识到它不是我正在查看的函数体,而是操作的构造函数参数(这是一个匿名函数(