Twirl模板可以使用class的構造函數方式生成(在template開始處使用 @this(args)語法),而不一定要用object的靜態方法。這意味着你可以將Twirl的模板注入到controllers。將控制權從controllers中反轉出來。這意味着可以將Twirl模板直接注入到控制器中,由模板來管理自己的依賴,而不是由控制器來管理依賴項以及需要渲染的模板。
舉個栗子,假設一個模板依賴了Summarizer組件,並被另一個controller引用:
trait Summarizer {
/** Provide short form of string if over a certain length */
def summarize(item: String)
}
創建一個 app/views/IndexTemplate.scala.html 並使用 @this 構造函數:
@this(summarizer: Summarizer)
@(item: String)
@{summarizer.summarize(item)}
最後使用構造函數注入來定義controller:
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))
}
}
一旦定義了模板,controller就可以注入它,但是 summarizer 對controller是不可見的。
如果你需要在Play項目以外使用Twirl,你需要手動加上如下依賴注入的設置:
TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"
而在Play應用已經爲你默認設置好了一切。