我有以下简化的模板设置:
现在,当用户登录时,会设置会话属性username
,以便我可以确定用户是否已登录。为了帮助我弄清楚用户是否登录,我有以下会话助手对象:
object SessionHelper {
val sessionKey = "username"
def authenticated(implicit request: RequestHeader) = {
request.session.get(sessionKey).exists(_ => true)
}
}
我可以在采用implicit
请求对象的模板中使用,例如:
(implicit request: play.api.mvc.RequestHeader)
...
@if(SessionHelper.authenticated) {
<strong>Authenticated!</strong>
}
...
因为 - 据我所知 - 这是在模板中获取隐式变量的唯一方法,这意味着在我渲染视图的任何地方,我都需要明确地“定义”隐式请求变量。例如:
def index = Action { implicit request =>
Ok(views.html.index(myStuff))
}
没有implicit request =>
语句,它不会编译。现在虽然这有点尴尬,只要我留在任何“子视图”(例如主页或详细信息)中,这很好,因为对于每个视图我都有一个控制器方法,因此也可以访问隐式{ {1}}实例。但是,当我需要在我的模板(例如Main)中访问会话时,这不起作用,因为它永远不会被控制器显式呈现。
我没有立即看到一种方法来访问模板中的会话,而快速的谷歌除了几个关于同一主题的问题之外没有其他任何解决方案。有什么想法吗?
更新:似乎与this question有点相关。
答案 0 :(得分:8)
除了Play Framework 2.0之外,没有办法在所有模板周围传递隐式请求。
您在更新中添加的链接是仅在1个对象中围绕模板移动更多数据,但您仍需要在任何地方声明隐式参数。
答案 1 :(得分:2)
我注意到一件有趣的事情:在我的Java Play 2.1.0应用程序中,我可以使用Play 1.2.5 documentation中列出的隐式对象,而在游戏2中根本没有记录它们!可能它类似于未记录的向后兼容性修复。无论如何,我可以这样做:
<li @if(request.uri == routes.Help.index.url){class="active"}>
和此:
@for( (key, message) <- flash) { ... }
如您所见,我可以使用request
和flash
变量而无需定义它们。我的IntelliJ经常将其强调为错误,但无论如何它都会编译并运行。因此,在2.0之后,似乎有几个版本可以解决这个问题。
答案 2 :(得分:2)
如果您使用的是Play for Java,则可以执行以下操作:
<li @if(requestHeader.uri == routes.Help.index.url){class="active"}>
只需忽略您的ide中的错误,它就会编译并运行良好。
requestHeader
方法由类play.TemplateImports
自动导入:
javaImports.add("play.core.j.PlayMagicForJava._");