§使用模板进行依赖注入
通过在模板顶部使用特殊的 @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 应用程序中,这已包含在默认设置中。
下一步: 常见用例
发现文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区交流。