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

オブジェクトの代わりに通常のクラスを使用し、インスタンスをパラメーターとしてテンプレートに渡すだけです。

このような:

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 に答える
0

PHP のようなリクエスト指向の言語から来ているときの感覚を知っています :)。ただし、アプリケーション全体のアクセスは VM の賜物と考えてください (PHP では、APC や eAccellerator などのバイトコードとデータ キャッシング ツールを使用する必要があります)。

テンプレートから名前/タグ/ID でブロックへの静的アクセスを提供する blockManager クラスをおそらく作成しますBlock.get("MyBlock")。次に、テンプレートに影響を与えることなく、キャッシング/保存戦略 (メモリに保持するか、ストレージからロードするか) を定義し、後で変更できます。

于 2014-01-06T19:07:09.290 に答える