我正在尝试为 Play Framework 2.0 创建一个插件(截至今天,2011年12月10日,Github上的最新代码)。该插件必须在视图中呈现一些数据。为了避免强迫用户修改所有模板,我创建了一个标签,用于检索和呈现相关数据。
为避免并发问题,应将数据存储在用户的标识符中。该标识符仅需要在请求期间有效(会话ID,请求本身等),在请求结束后,信息将被丢弃。
问题是Request,RequestHeader和Session都不能作为Scala模板中的隐式值。那么,哪些是模板中可用的隐含值?
如果没有我可以使用的,您是否有任何关于如何获取我可以从模板和控制器访问的值的建议(无需用户既不修改控制器或模板)又可以生成每个请求的基础?
答案 0 :(得分:7)
我找到了
session
这是一个play.mvc.Http.Session对象request
这是一个play.mvc.Http.Request对象response
这是一个play.mvc.Http.Response对象flash
这是一个play.mvc.Http.Flash对象lang
这是一个play.i18n.Lang对象仍然可用,而1.x中的隐式对象errors
,out
,params
和play
已被删除。看起来这个列表由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
。