我有以下play2代码:
implicit def contextToRequest(rc: RequestContext[_]) = rc.request
implicit def contextToFlash(rc: RequestContext[_]) = rc.request.flash
implicit def contextToSession(rc: RequestContext[_]) = rc.request.session
def login: Action[AnyContent] = PublicAction { implicit rc =>
Ok(html.login(loginForm))
}
RequestContext
是我自己的Play2 Request
自定义类包装器。
我的scala视图以:
开头@(form: Form[(String,String,Boolean)])(implicit flash: Flash, session: Session,rc: utils.RequestContext[_])
但是编译器说:
无法找到参数flash的隐含值:play.api.mvc.Flash
有人可以向我解释为什么它不起作用? 也许我们不能将隐式转换用于隐式参数?
那么有人可以向我解释为什么已经有一个从Play2请求到Session / Flash的隐式转换,当我这样做时它不起作用吗?
答案 0 :(得分:1)
当您最终拥有多个隐式参数(其中一些是其他参数的成员属性)时,您的设计会出现问题。
class B
class C
class A {
val b:B = _
val c:C = _
}
def myMethod(someData:String)(implicit a:A, b:B, c:C) {
}
事实上,你想要在你的方法中拥有的是那个A的B和C成员。然而,有了这样的签名,可以提供给定的A和B和C与之无关。 A.正确的签名将是以下
def myMethod(someData:String)(implicit a:A) {
// trick to import members variable
import a._
println(b)
println(c)
}
答案 1 :(得分:0)
嗯,似乎它适用于:
implicit def contextToRequest(implicit rc: RequestContext[_]) = rc.request
我不需要其他2种方法,因为存在歧义,因为Play2已经提供了Request to Flash / Session的隐式转换