[英]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.