我目前是来自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对象是针对整个应用程序范围定义的,而不是针对单个请求。每个请求的对象都是相同的。
正确的方法是什么,我想要做什么?我可以创建包含所有块的容器并使用每个请求实例化它,然后只传递给所有模板。但我觉得这是错误的方式。
答案 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")
。然后,您可以定义并稍后修改您的缓存/存储策略(保留在内存中,而不是从存储中加载),而不会影响您的模板。