Scala隐式转换+参数与Play2控制器/视图一起使用

时间:2012-08-08 18:11:49

标签: scala playframework implicit-conversion implicit

我有以下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的隐式转换,当我这样做时它不起作用吗?

2 个答案:

答案 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的隐式转换