ドキュメント

§テンプレートを用いた依存性注入

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アプリケーション内では、これはすでにデフォルト設定に含まれています。

次: 一般的なユースケース


このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。 質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。