哪些是默认情况下模板上可用的隐式对象?

时间:2011-12-10 20:45:15

标签: scala playframework-2.0

我正在尝试为 Play Framework 2.0 创建一个插件(截至今天,2011年12月10日,Github上的最新代码)。该插件必须在视图中呈现一些数据。为了避免强迫用户修改所有模板,我创建了一个标签,用于检索和呈现相关数据。

为避免并发问题,应将数据存储在用户的标识符中。该标识符仅需要在请求期间有效(会话ID,请求本身等),在请求结束后,信息将被丢弃。

问题是Request,RequestHeader和Session都不能作为Scala模板中的隐式值。那么,哪些是模板中可用的隐含值

如果没有我可以使用的,您是否有任何关于如何获取我可以从模板和控制器访问的值的建议(无需用户既不修改控制器或模板)又可以生成每个请求的基础?

2 个答案:

答案 0 :(得分:7)

我找到了

仍然可用,而1.x中的隐式对象errorsoutparamsplay已被删除。看起来这个列表由play.mvc.Http.Context.Implicit确定,其javadoc说“在模板中导入以获取隐式HTTP上下文”。所以我非常有信心这是自动提供的完整列表。

还有一个@Messages似乎替换了messages隐式对象以及1.x中的&{'my.message.key'}语法。它实际上是方法调用的简写,而不是隐式对象。您可以执行调用play.Messages.get(String,Object...)@Messages("my.message.key"),也可以使用调用play.Messages.get(Lang,String,Object...)@Messages("index.title")(Lang("es"))@Messages("index.title")(Lang("es-ar"))强制使用某种语言。

答案 1 :(得分:5)

是的,这对我来说也是个问题......

实际上,他们可能只有一个implicit,但您仍然必须添加它到参数列表并声明 Action中所需的对象为implicit

我是这样做的:

模板

// **FIRST** add the needed implicit parameter to the template (the whole template will be created as a function will the related parameters, incl. curryed parameters list are handled) 
@(stuff:models.MyStuff)(implicit request: play.api.mvc.Request[Any])

@import helper._

@main("Home"){

}

控制器

object Main extends Controller {
  def index = Action {
    // **SECONDLY** declare the request as implicit.
    implicit request =>
      Ok(views.html.index(MyStuff()))
    }
}

更多?

由于单个implicit参数有效,您可以将所需对象包装在专用结构中,并将其声明为implicit