Соглашение о формах Scala Play 2.5 и неявный доступ к сообщениям (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 каждый раз.

1 ответ

Решение

Сделай свой PasswordChangeForm синглтон-класс и Inject MessagesApi с помощью Guice-зависимости Injection.

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

использование:

messages("somekey")

Вышеуказанная структура является синглтоном и обеспечивается обманом. Guice внедряет сообщения API во время инициализации PasswordChangeForm,

Другие вопросы по тегам