我一直在学习和玩Scala,同时我一直在努力学习Play!特别是Scala版本。
我理解对象的apply-methods,甚至将代码块传递给Trait或Class。但是在所有示例中,动作代码块示例类似于:
def index = Action {
Ok("Got request [" + request + "]")
}
所以在这里我们使用Action-companion对象帮助器,我们将代码块传递给这个伴随对象apply-function?
但我不明白的是“请求”在哪里填充?这是我在Scala遇到的事情,一些“神秘”的魔法刚刚发生,但我需要了解它。 :)
所以如果有人可以向Scala和Play解释这个!新手你的帮助将不胜感激。
答案 0 :(得分:4)
它实际上并不那么神奇(至少在这种情况下)。控制器接收请求并产生响应。在Play中,如果您不需要访问或使用任何请求信息,则可以写入此内容:
def index = Action {
Ok("hello, world") // Not using the request!
}
但是你编写的代码(截至目前)实际上并不会编译,因为正如你所说,没有给出请求。相反,你需要这样做:
def index = Action { request =>
Ok("Got request [" + request + "]")
}
即。请求是函数的参数,该函数返回Result
(Ok
)。
是的,你是对的,这相当于写作:
def index = Action.apply({ request =>
Ok("Got request [" + request + "]")
})
或甚至更明确地说:
def myAction[T]: (Request[T] => Result) = request => Ok("Got request [" + request + "]")
def index = Action.apply(myAction)
index
是不直接返回响应的函数。它是框架调用以获取请求的处理程序(Action
)的函数。然后可以使用传入请求调用该处理程序以生成响应。
还有其他变化。默认情况下,请求的内容(即正文)作为通用AnyContent
处理。如果要以某种特定方式显式解析正文,例如JSON,则可以传递BodyParser
作为第一个(curried)参数:
def index = Action(myBodyParser) { request =>
Ok("Got request [" + request + "]")
}
注意:将请求设为隐式参数是很常见的,因此它会自动传递给模板:
def index = Action { implicit request =>
Ok(views.html.mypage())
}
对于某些模板代码,例如:
@()(implicit request: RequestHeader)
<h1>I was called at @request.path</h1>