Scala Play 2.5 表单约定和隐式消息 (MessagesApi) 访问

Scala Play 2.5 Form convention and implicit Messages (MessagesApi) access

我正在研究 this Scala Play application,经过一番研究和思考后,我最终倾向于将所有表单放在表单包下的设计中,该表单包位于它们在视图中使用的级别(或最顶层)适用)例如

 app
    | views 
           | account
                    | form (all Form used by account will be here)
                          | PasswordChangeForm.scala

那么PasswordChangeForm.scala形式实现为:

package views.account.form

import play.api.data.Form
import play.api.data.Forms.{mapping, text}
import play.api.i18n.Messages

case class PasswordChange(password: String, repeatPassword: String)

object PasswordChangeForm {
  val Instance = Form {
    mapping(
      "password" -> text(minLength = 5),
      "repeatPassword" -> text(minLength = 5)
    )(PasswordChange.apply)(PasswordChange.unapply).
      verifying(Messages("playauthenticate.change_password.error.passwords_not_same"),
        data => data.password != null && !data.password.isEmpty && data.password.equals(data.repeatPassword))
  }
}

问题是我不知道如何让 Messages 或更好的 MessagesApi 可用于错误报告的表单。

编译器错误符合预期could not find implicit value for parameter messages: play.api.i18n.Messages:

[error] /home/bravegag/code/play-authenticate-usage-scala/app/views/account/form/PasswordChangeForm.scala:15: could not find implicit value for parameter messages: play.api.i18n.Messages
[error]       verifying(Messages("playauthenticate.change_password.error.passwords_not_same"),

UPDATE 一种可能性是重构上面的解决方案:

val Instance = Form { 

def create(implicit messages: Messages) = Form {

但随后它每次都会创建一个 Form 的新实例。

让你的 PasswordChangeForm 成为单例 class 并使用 guice 依赖注入来注入 MessagesApi

@Singleton
class PasswordChangeForm @Inject() (messages: MessagesApi) {
  //now use it like this messages("somekey")
}

用法:

messages("somekey")

以上结构是单例的,由guice保证。 Guice 在 PasswordChangeForm 的初始化期间注入消息 api。