PlayFramework在当前请求范围中实例化对象?

时间:2013-09-18 23:09:29

标签: scala web playframework-2.1

我目前是来自PHP世界的活跃PlayFramework学习者。

例如我在我的应用程序中有一个Head块对象,它应该包含标题,charset编码,元信息等。类似于Magento块,但没有XML声明

package blocks.Page

object Head {
  var title: String = "";
}

在Application.index()方法中我有

blocks.Page.Head.title
Ok(views.html.application.index());

最后在html模板中

@import blocks.Page.Head
<title>@Head.title</title>

但是,blocks.Page.Head对象是针对整个应用程序范围定义的,而不是针对单个请求。每个请求的对象都是相同的。

正确的方法是什么,我想要做什么?我可以创建包含所有块的容器并使用每个请求实例化它,然后只传递给所有模板。但我觉得这是错误的方式。

2 个答案:

答案 0 :(得分:0)

只需使用常用的类而不是对象,并将实例作为参数传递给模板。

像这样:

package blocks.Page

case class Head(title: String = "")

控制器:

val head = Head("Blah")
Ok(views.html.application.index(head))

模板看起来像:

@(head: blocks.Page.Head)

...
<title>@head.title</title>

答案 1 :(得分:0)

我知道来自面向请求的语言(如PHP :)的感觉。但是,考虑将应用程序范围的访问作为VM的礼物(在PHP中,我们需要使用一些字节码和数据缓存工具,如APC或eAccellerator)。

我可能会创建一个blockManager类,它允许您通过模板中的name / tag / id静态访问块:Block.get("MyBlock")。然后,您可以定义并稍后修改您的缓存/存储策略(保留在内存中,而不是从存储中加载),而不会影响您的模板。