Play Framework 2.4 在 Scala 模板中使用注入变量

Posted

技术标签:

【中文标题】Play Framework 2.4 在 Scala 模板中使用注入变量【英文标题】:Play Framework 2.4 use injected variable in Scala template 【发布时间】:2015-10-04 14:44:24 【问题描述】:

我想在我的网页菜单栏中显示一些数据库中的数据。为了获取数据,我有一个通常使用 Guice 注入创建的数据访问对象 (DAO)。

如何在我的 Scala 模板中使用这样的(注入的)对象?

我可以将它作为参数传递给模板,但我必须在每一页上都这样做(因为它应该显示在菜单栏中)。我正在寻找另一种解决方案,我不必到处传递它。目前我正在模板内创建一个新对象,每当它被渲染时(这让我的代码更简洁但性能更差)。

【问题讨论】:

我认为没有一种直接的方法可以实现您想要的,但我认为here 的答案可以提供帮助。 能否在单独的模板中抽象菜单栏以避免在每个模板中传递参数? @BhashitParikh:感谢您的链接,这确实是一个可行的选择。然而,仍然不是我想要的。 @Adi:我的菜单栏模板已经在一个单独的模板中。但是我是从所有其他模板中调用它的,因此必须通过它们提供参数。 【参考方案1】:

你可以毫不费力地伪造这个。

首先,创建一个 Scala 对象来提供对 DAO 的访问(它可以包含任意数量的东西,只需在***对象和 Implicits 对象中重复该模式)。

package com.example.stuff

object ViewAccessPoint 
  private[stuff] val myDaoCache = Application.instanceCache[MyDao]

  object Implicits 
    implicit def myDao(implicit application: Application): MyDao = myDaoCache(application)
  

在您看来,然后您可以将 Implicits 对象导入您的模板并获取 Guice 创建的 DAO。

@import com.example.stuff.ViewAccessPoint.Implicits._
@import play.api.Play.current

myDao.whatever()

这适用于 Java 和 Scala 项目。

你可以在这里看到这个实践:

Access point Template

附带说明,我会考虑您是否真的想在模板层中进行数据访问。

【讨论】:

谢谢,您节省了我很多时间,无需将对象传递给超过 100 个模板。 在您的模板中,您还需要@import play.api.Play.current 才能完成这项工作。 @Itchy 我正在尝试做同样的事情,但我收到了一个编译器警告,指出不推荐使用@import play.api.Play.current。你知道如何用 DI 做到这一点吗?我正在使用 Play 2.5 顺便说一句 @RyanStull 它已被弃用,但您仍然需要这样做。我认为模板的 DI 将从 2.6 开始支持。或者,您可以使用 twirl 1.2 - 有关详细信息,请参阅 this thread。

以上是关于Play Framework 2.4 在 Scala 模板中使用注入变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Play Framework 2.4 中为 Scala 实现 Akka

Play Framework 2.4 全局对象迁移

如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?

由于构建或路由导致 Play Framework 2.4 编译错误

Play Framework 2.4 授权

如何在 play framework(scala) 2.4 中获取当前会话或请求对象?