2

問題(これは機能します)

アプリケーションで Play 2.1.x バージョンを使用しています。私のアプリケーションには、SignIn/SignOut リンクを持つ静的なヘッダー/ツールバーがあります。すべてのテンプレートでステータス ヘッダーの HTML コードを繰り返す代わりに、main.scala.html テンプレートでそれを作成しました。SignIn/SignOut ステータスを変更するには、引数を main.scala.html に渡す必要があります。私が正しければ、これはプレイで使用するすべてのテンプレートの親テンプレートであるため、メイン テンプレートに引数を追加する場合は、インデックス、ログインなど (名前を付ける) などの子テンプレートによって提供する必要があります。

これまでのところ、トレイトに暗黙的な定義を作成し、コントローラーにこのようなトレイトを実装させることでこれを行うことができます(合成の混合...)

class ApplicationController extends Controller with ImplicitSession{

}

trait ImplicitSession {
implicit def status(implicit session: play.api.mvc.Session): Boolean = {
session.get("session") match {
  case None => false
  case _ => true
 }
}

そして、他のすべてのコントローラーがコントローラーを再生するだけでなく、ApplicationControllerを拡張できるようにします

object LoginController extends ApplicationController{...}

今、私のテンプレートの引数は次のようになります...

メイン テンプレート

@(title: String)(content: Html)(implicit status : Boolean)

ログインのような他のテンプレート...

@(message: String)(implicit status : Boolean)

これは問題なく機能しますが、この追加の暗黙的なパラメーターをすべてのテンプレートに渡す必要があるため、解決策に満足していません

この暗黙的なパラメーターをすべての子テンプレートに渡すことを本当に避けたい

これは冗長なコードであり、実際には適切なプログラミング手法ではないと感じているためです。この概念が頭の中で明確に理解できなかったようです

また、コンパイラは Action{ implicit request =>を作成中のすべてのコントローラに配置するように強制します。そうしないと、コンパイル エラーがスローされます。

プレイバンドルで提供されているサンプルコードを確認しましたが、それらは優れていますが、フローの疑いは明確ではありません..

前もって感謝します

4

2 に答える 2

1

この暗黙的なパラメーターをすべての子テンプレートに渡すことを本当に避けたい

答えは(悲しいことに)避けることはできないということです。

これについては、James Roper (Typesafe の Play Framework 開発者) による優れたブログをご覧ください。

私もこのパターンを使用しますが、ApplicationContextすべてのビューに渡すケース クラスの名前を使用することを好みました。

case class ApplicationContext(user: Option[User], moreData: SomeData)

trait ApplicationController extends Controller {
  implicit def context[A](implicit request: Request[A]): ApplicationContext = {
    // Find all necessary data needed
    ...
    ApplicationContext(user, data)
  }
}

そして、私のビューは通常、次のパラメーターを取ります ( Langi18n の使用を含む):

@(message: String)(implicit lang: Lang, context: ApplicationContext)
于 2013-09-17T07:11:55.010 に答える