我正在使用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
等?
答案 0 :(得分:2)
Action
不是类型,它是一个函数。如果是类型,则index
的签名看起来像
def index: Action = { implicit request =>
请注意添加:
和=
相关的documentation表示行动是
处理请求并生成要发送的结果的函数 客户
如您所知,您正在返回play.api.mvc.Result
答案 1 :(得分:0)
好的,现在感谢同事了解它是什么。该语法只是意味着返回一个对象,在这种情况下是一个类型为Action
的对象,并且该操作将构造函数作为一个函数,该函数将一个Request作为输入并返回一个SimpleResult
,它可以被重写为例如
object Application extends Controller {
/**
* Index action handler
*/
def index : Action[AnyContent] = {
Action(implicit request => Ok(Json.obj("one" -> "two")))
}
}
让它真正令人困惑的是,在Scala中,它们可以在一定程度上模糊地在括号和大括号之间切换。因此,实现它不是我正在查看的函数体,而是一个动作的构造函数参数(这是一个匿名函数),这很难实现