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
如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?