Scala 如何在注入MessageApi并使用I18nSupport特性时传递消息

Scala 如何在注入MessageApi并使用I18nSupport特性时传递消息,scala,playframework,playframework-2.4,Scala,Playframework,Playframework 2.4,我的控制器操作使用的自定义操作如下所示: class ActionWithContext @Inject()(....) extends ActionBuilder[ContextAwareRequest] { def invokeBlock[A](request: Request[A], block: (ContextAwareRequest[A]) => Future[Result]) = { ... } } class Co

我的控制器操作使用的自定义操作如下所示:

class ActionWithContext @Inject()(....)
  extends ActionBuilder[ContextAwareRequest] {

  def invokeBlock[A](request: Request[A], block: (ContextAwareRequest[A]) =>                   Future[Result]) = {
  ... 
  }

}

class ContextAwareRequest[A](val context: MyContext, request: Request[A]) extends WrappedRequest[A](request)
import play.api.i18n.{MessagesApi, I18nSupport, Messages}
import play.api.i18n.Messages.Implicits._
class WebsiteController @Inject() (val messagesApi: MessagesApi, actionWithContext: ActionWithContext, ..)
      extends BaseController with I18nSupport {


    def edit(websiteId: Int)  =  actionWithContext { request =>
        val model = ..
        Ok(views.html.backend.websites.edit(model)(request.context))
      }

    }
@(form: Form[controllers.WebsiteForm])(implicit context: MyContext, m: Messages) {


}
我的控制器看起来像:

class ActionWithContext @Inject()(....)
  extends ActionBuilder[ContextAwareRequest] {

  def invokeBlock[A](request: Request[A], block: (ContextAwareRequest[A]) =>                   Future[Result]) = {
  ... 
  }

}

class ContextAwareRequest[A](val context: MyContext, request: Request[A]) extends WrappedRequest[A](request)
import play.api.i18n.{MessagesApi, I18nSupport, Messages}
import play.api.i18n.Messages.Implicits._
class WebsiteController @Inject() (val messagesApi: MessagesApi, actionWithContext: ActionWithContext, ..)
      extends BaseController with I18nSupport {


    def edit(websiteId: Int)  =  actionWithContext { request =>
        val model = ..
        Ok(views.html.backend.websites.edit(model)(request.context))
      }

    }
@(form: Form[controllers.WebsiteForm])(implicit context: MyContext, m: Messages) {


}
查看页面如下所示:

class ActionWithContext @Inject()(....)
  extends ActionBuilder[ContextAwareRequest] {

  def invokeBlock[A](request: Request[A], block: (ContextAwareRequest[A]) =>                   Future[Result]) = {
  ... 
  }

}

class ContextAwareRequest[A](val context: MyContext, request: Request[A]) extends WrappedRequest[A](request)
import play.api.i18n.{MessagesApi, I18nSupport, Messages}
import play.api.i18n.Messages.Implicits._
class WebsiteController @Inject() (val messagesApi: MessagesApi, actionWithContext: ActionWithContext, ..)
      extends BaseController with I18nSupport {


    def edit(websiteId: Int)  =  actionWithContext { request =>
        val model = ..
        Ok(views.html.backend.websites.edit(model)(request.context))
      }

    }
@(form: Form[controllers.WebsiteForm])(implicit context: MyContext, m: Messages) {


}
我得到一个错误:

not enough arguments for method apply: (implicit context: com.example.services.components.MyContext, implicit m: play.api.i18n.Messages)play.twirl.api.HtmlFormat.Appendable in class edit.
[error] Unspecified value parameter m.
[error]     Ok(views.html.websites.edit(model)(request.context))
[error]                                
我尝试传入messageApi,如下所示:

 Ok(views.html.websites.edit(model)(request.context, messageApi))
但随后我得到了消息和MessageApi之间的类型不匹配错误

我该怎么办


p.S我甚至没有在视图中使用消息,但我使用的是表单帮助程序,我猜它在封面下使用消息…

看起来您试图显式传递一个隐式参数,隐式传递另一个参数。您必须明确地传递它们:

Ok(views.html.websites.edit(model)(request.context, implicitly[Messages]))
或者两者都隐含:

implicit val context = request.context
Ok(views.html.websites.edit(model))

是否可以以某种方式在myActionWithContext中添加“implicit val context=request.context”?因为每个操作都会有这个代码,如果我能避免将它添加到我的所有操作中,那就太好了。你应该能够编写一个包含类似于
隐式def request2Context(隐式请求:ContextAwareRequest):MyContext=request.context
,然后以类似于您在
I18nSupport
中混合的方式混合该特性。请参见此以获取灵感:或者只需将
def
添加到
BaseController
。如果我没有在视图中使用消息,为什么它会期待它?这是因为表单帮助程序?我是否也可以在basecontroller中隐式地执行[消息]?不确定我是否能以某种方式注入basecontroller?