文档

§使用模板进行依赖注入

通过在模板顶部使用特殊的 @this(args) 语法声明构造函数,Twirl 模板可以生成一个类而不是一个静态对象。这意味着 Twirl 模板可以直接注入到控制器中,并可以管理自己的依赖项,而不是控制器必须不仅管理自身依赖项,还要管理它必须渲染的模板的依赖项。

例如,假设一个模板依赖于一个组件 Summarizer,该组件没有被控制器使用

trait Summarizer {
  /** Provide short form of string if over a certain length */
  def summarize(item: String)
}

使用 @this 语法为构造函数创建一个文件 app/views/IndexTemplate.scala.html

@this(summarizer: Summarizer)
@(item: String)

@{summarizer.summarize(item)}

最后,通过在构造函数中注入模板来定义 Play 中的控制器

public MyController @Inject()(template: views.html.IndexTemplate, 
                              cc: ControllerComponents) 
  extends AbstractController(cc) {
  
  def index = Action { implicit request =>
    val item = "some extremely long text"
    Ok(template(item))
  }
}

一旦模板及其依赖项被定义,控制器就可以将模板注入到控制器中,但控制器不会看到 Summarizer。

如果您在 Play 应用程序之外使用 Twirl,您将必须手动添加 @Inject 注解,说明此处应使用依赖注入

TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"

在 Play 应用程序中,这已包含在默认设置中。

下一步: 常见用例


发现文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区交流。