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?