0

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

例如,我的应用程序中有一个 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 对象是为整个应用程序范围定义的,而不是为单个请求定义的。这个对象对于每个请求都是相同的。

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

4

2 回答 2

0

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

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

于 2014-01-06T19:07:09.290 回答
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>
于 2013-09-19T03:27:09.417 回答