ドキュメント

§テンプレートにおける依存性注入

Twirlテンプレートは、テンプレートの先頭に特別な `@this(args)` 構文を使用してコンストラクタを宣言することにより、静的オブジェクトではなくクラスとして生成できます。 つまり、Twirlテンプレートはコントローラーに直接注入でき、コントローラーが自身とレンダリングする必要があるテンプレートの両方の依存関係を管理するのではなく、独自の依存関係を管理できます。

例として、テンプレートがコントローラーでは使用されないコンポーネント `Summarizer` に依存しているとします。

public interface Summarizer {
  /** Provide short form of string if over a certain length */
  String summarize(String item);
}

コンストラクタに `@this` 構文を使用して、ファイル `app/views/IndexTemplate.scala.html` を作成します。

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

@{summarizer.summarize(item)}

最後に、Playでコントローラーを定義し、コンストラクタにテンプレートを注入します。

public class MyController extends Controller {
  
  private final views.html.IndexTemplate template;

  @Inject
  public MyController(views.html.IndexTemplate template) {
    this.template = template;
  }

  public Result index() {
    String item = "some extremely long text";
    return ok(template.render(item));
  }

}

テンプレートが依存関係とともに定義されると、コントローラーはテンプレートをコントローラーに注入できますが、コントローラーは `Summarizer` を認識しません。

Playアプリケーションの外部でTwirlを使用している場合は、ここに依存性注入を使用する必要があることを示す `@Inject` アノテーションを手動で追加する必要があります。

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

Playアプリケーション内では、これはすでにデフォルト設定に含まれています。

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


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