播放2.x Scala控制器需要澄清

时间:2013-09-19 18:15:53

标签: scala playframework controller playframework-2.0

我一直在学习和玩Scala,同时我一直在努力学习Play!特别是Scala版本。

我理解对象的apply-methods,甚至将代码块传递给Trait或Class。但是在所有示例中,动作代码块示例类似于:

def index = Action {
Ok("Got request [" + request + "]")
}

所以在这里我们使用Action-companion对象帮助器,我们将代码块传递给这个伴随对象apply-function?

但我不明白的是“请求”在哪里填充?这是我在Scala遇到的事情,一些“神秘”的魔法刚刚发生,但我需要了解它。 :)

所以如果有人可以向Scala和Play解释这个!新手你的帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

它实际上并不那么神奇(至少在这种情况下)。控制器接收请求并产生响应。在Play中,如果您不需要访问或使用任何请求信息,则可以写入此内容:

def index = Action {
   Ok("hello, world")  // Not using the request!
}

但是你编写的代码(截至目前)实际上并不会编译,因为正如你所说,没有给出请求。相反,你需要这样做:

def index = Action { request =>
  Ok("Got request [" + request + "]")
}

即。请求是函数的参数,该函数返回ResultOk)。

是的,你是对的,这相当于写作:

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>