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



我正在开发这个 Scala Play 应用程序,经过一段时间的研究和思考,最终倾向于将所有表单放在表单包下的设计,这些表单在视图(或适用的最顶层)中使用它们的级别,例如

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"),

更新一种可能性是从以下方面重构上述解决方案:

val Instance = Form { 

def create(implicit messages: Messages) = Form {

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

PasswordChangeForm设为单例类并使用 guice 依赖项注入注入MessagesApi

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

用法:

messages("somekey")

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

最新更新