【问题标题】:Which are the implicit objects available by default on templates?模板上默认可用的隐式对象有哪些?
【发布时间】:2026-02-15 12:05:02
【问题描述】:

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

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

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

如果没有我可以使用,您对如何获取我可以从模板和控制器访问的值有任何建议(无需用户修改控制器或模板)并且可以在每个请求的基础?

【问题讨论】:

  • 您好 Pere,您的回答还可以吗?在这种情况下,不要忘记接受它,因为我在其他论坛上看到了几个问题,您的问题可能会有所帮助。谢谢
  • 抱歉,最近没有经常进入 :)

标签: scala playframework-2.0


【解决方案1】:

我找到了

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

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

【讨论】:

    【解决方案2】:

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

    实际上,他们可以拥有一个implicit,但您仍然必须将其添加到参数列表中并声明所需的在操作中将对象作为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

    【讨论】:

    • 很好.. 现在如果我的控制器是 Java 怎么办?没有隐含的
    • 很抱歉,我还没有尝试使用 Java 进行游戏...也许您可以将请求明确定义为参数?
    • 实际上变量 session、request、response 和 flash 似乎在 scala 模板中神奇地可用;-)