简体   繁体   中英

PlayFramework instantiate object in current request scope?

I am currently active PlayFramework learner who came from world of PHP.

For example I have a Head block object in my app, which should hold title, charset encoding, meta information, etc. Something similar to Magento blocks, but without XML declaration

package blocks.Page

object Head {
  var title: String = "";
}

In Application.index() method I have

blocks.Page.Head.title
Ok(views.html.application.index());

And finally in html template

@import blocks.Page.Head
<title>@Head.title</title>

However, blocks.Page.Head object is defined for entire application scope, not for single request. This object is the same for each request.

What is the right way to do, what I am trying to do? I can create container with all blocks and instantiate it with each request, then just pass to all templates. But I have a feeling that this is wrong way.

Just use usual class instead of object and pass instance to template as parameter.

Like this:

package blocks.Page

case class Head(title: String = "")

Controller:

val head = Head("Blah")
Ok(views.html.application.index(head))

And template will looks like:

@(head: blocks.Page.Head)

...
<title>@head.title</title>

I know the feeling when coming from a request-oriented language like PHP :). However, consider application-wide access as a gift of a VM (in PHP we need to go the extra mile of using some bytecode and data caching tool like APC or eAccellerator).

I would probably create a blockManager class which gives you static access to blocks by name/tag/id from the template: Block.get("MyBlock") . Then you can define and later modify your caching / storing strategy (holding in memory vs. loading from storage) without affecting your templates.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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