2017-01-16 8 views
2

PlayFrameworkは依存関係注入を使用してグローバル状態から年のように動いているので、誰もガイド/チュートリアルを書き換えることができないため、どこにでも私の質問に答えが見つかりません。PlayFramework 2.5テンプレート - Twirl Dependency Injection

プレイ2.5以降、ツイールテンプレートでもグローバルな状態から離れなければなりません。 は、次に例えば:Javaで

コントローラ:

public class Application extends Controller { 

    @Inject WebJarAssets webJarAssets; 

    public Result index() { 
     return ok(index.render(webJarAssets)); 
    } 

} 

とテンプレートを:あなたのテンプレートでWebJarAssetsを使用したい、あなたは、このガイド(http://www.webjars.org/documentation)によれば、使用する必要が

@(webJarAssets: WebJarAssets) 
<!DOCTYPE html> 
<html> 
    <head> 
     <link rel='stylesheet' href='@routes.WebJarAssets.at(webJarAssets.locate("css/bootstrap.min.css"))'> 
    </head> 
    <body> 
    </body> 
</html> 

それは意味があり、簡単に行うことができます。しかし、あなたのテンプレートは、通常より多くの1つのパラメータを持っていますし、今あなたがテンプレートや他の..でも使用したいかもしれないMeesageApiがありますJavaであなたはパラメータとしてすべてを渡す必要がありますあなたのテンプレートは、読んで管理するのが難しい。今Play2.4のような古いバージョンから移行した場合、あなたが作成したすべてのテンプレートのパラメータとすべてのコントローラを編集する必要がありません。プロジェクトが本当に大きい場合、これは非常に不必要な作業です。

テンプレートでも使用できるDIである必要があります。この問題は既にここに固定する必要があります。Injectable templates

だから私はそこに書かれたものに続くとplugins.sbtに追加:

addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.2.0") 

はbuild.sbtに追加:

私はまた
TwirlKeys.constructorAnnotations += "@javax.inject.Inject()" 

をリゾルバは次のようになります。

resolvers += Resolver.sonatypeRepo("snapshots") 

次に、DIirlをテンプレートtwirlに追加しました。

@import play.twirl.api.HtmlFormat 
@import b3.vertical.fieldConstructor 
@import views.html.menu.menu 
@import controllers.WebJarAssets 
@(title: String)(implicit headInsert: Html = HtmlFormat.empty, content: Html = HtmlFormat.empty) 

@this(webJarAssets: WebJarAssets) 

は、プレイを再開し、私はまだエラーを取得しています:

play.sbt.PlayExceptions$CompilationException: Compilation error[not found: value webJarAssets] 

私は何を逃したのですか?コントローラーの中に何かを注入するべきですか? どこでもDIを使用するプレイアプリの例はありますか?

+0

私はあなたもコントローラにビューを注入する必要があると思います。そうしないと、テンプレートはDIフレームワークによって処理されません。問題の最後のコメントをjavaでどうやって行うかを見てください:https://github.com/playframework/twirl/pull/100#issuecomment-265736004 さらに、 '@this()'が'@(params)'の前に置かれます。 –

+1

ありがとう、実際に@ this()は@paramsの前に置かなければならなかった –

+0

あなたがそれを解決したことは素晴らしい。私は同じ問題を抱えている人を助けるためにそれを受け入れることができるように答えとして追加します。 –

答えて

1

@this()の依存関係注入値とテンプレートを描画するためのパラメータを使用してコンストラクタを呼び出す順序が重要です。通常のテンプレートパラメータの前に@this()を配置する必要があります。

@import play.twirl.api.HtmlFormat 
@import b3.vertical.fieldConstructor 
@import views.html.menu.menu 
@import controllers.WebJarAssets 

@this(webJarAssets: WebJarAssets) 

@(title: String)(implicit headInsert: Html = HtmlFormat.empty, content: Html = HtmlFormat.empty) 
関連する問題