§テンプレートを用いた依存性注入
Twirlテンプレートは、テンプレートの先頭に特別な `@this(args)` 構文を使用してコンストラクタを宣言することにより、静的オブジェクトではなくクラスとして生成できます。 つまり、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アプリケーション内では、これはすでにデフォルト設定に含まれています。
次: 一般的なユースケース
このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。 質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。