繁体   English   中英

PlayFramework实例化当前请求范围内的对象?

[英]PlayFramework instantiate object in current request scope?

我目前是PlayFramework的活跃学习者,来自PHP领域。

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

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

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

像这样:

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>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM