Scala PlayFramework是否在当前请求范围内实例化对象?

Scala PlayFramework是否在当前请求范围内实例化对象?,scala,web,playframework-2.1,Scala,Web,Playframework 2.1,我目前是一名活跃的PlayFramework学习者,来自PHP世界 例如,我的应用程序中有一个Head block对象,它应该包含标题、字符集编码、元信息等,类似于Magento块,但没有XML声明 package blocks.Page object Head { var title: String = ""; } 在Application.index()方法中 blocks.Page.Head.title Ok(views.html.application.index()); 最后

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

例如,我的应用程序中有一个Head block对象,它应该包含标题、字符集编码、元信息等,类似于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>
@import blocks.Page.Head
@标题
但是,blocks.Page.Head对象是为整个应用程序范围定义的,而不是为单个请求定义的。此对象对于每个请求都是相同的


正确的方法是什么,我正在尝试做什么?我可以创建包含所有块的容器,并在每个请求中实例化它,然后传递到所有模板。但我有一种感觉,这是错误的方式

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

像这样:

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>
@(标题:blocks.Page.head)
...
@标题

我知道来自像PHP这样的面向请求的语言时的感觉:)。但是,将应用程序范围的访问视为VM的礼物(在PHP中,我们需要额外使用一些字节码和数据缓存工具,比如APC或EACELLER)。
我可能会创建一个blockManager类,该类允许您通过模板中的名称/tag/id静态访问块:
Block.get(“MyBlock”)
。然后,您可以定义并在以后修改缓存/存储策略(保留在内存中而不是从存储中加载),而不会影响模板。

问题是,我可能有几十个这样的块。我不想传递那么多的参数。显然,我可以创建一些对象作为块持有者,但我相信人们已经解决了这个问题。Play是一个非常简单的框架,所以没有任何神奇的方法来传递和保持页面的参数。你也可以尝试使用隐式参数来简化你的调用。那么人们会这样做吗?在你的页面上可以有很多块。人们只是传递隐式参数?我找不到人们是怎么做的。我甚至不知道该搜索什么。