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。
我正在研究 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。