如何将参数发送到自定义操作?

时间:2015-05-01 10:39:25

标签: scala playframework playframework-2.0

我正在使用play framework 2.3的动作组合,我想将参数发送到自定义动作。

例如,如果您有一个自定义操作,可以添加缓存,自定义操作可以如何接收缓存密钥和所需的缓存时间。播放控制器内的示例代码:

def myAction(p1: String) = CachedAction(key="myAction1"+p1, time = 300.seconds) { 
 implicit request =>
... do an expensive calculation …
    Ok(views.html.example.template())
}

我已经测试了一个结合自定义请求的ActionBuilder,但我还没有找到解决方案。

我知道play为操作提供了缓存,遗憾的是缓存不能满足所有要求。

1 个答案:

答案 0 :(得分:1)

我不确定ActionBuilderActionRefiner的解决方案,但这可能对您有用:

def CachedAction(key: String, time: Duration)(f: Request[AnyContent] => Result) = {
  Action{ request =>
    if(cache.contains(key)){
      ...
    } else{
      ...
    }
    f(request)
  }
}

然后:

def myAction(p1: String) = CachedAction("hello" + p1, 100 millis){ request =>
  Ok("cached action")
}

编辑: 既然你需要Action.async,你可以这样写:

case class Caching[A](key: String, time: Duration)(action: Action[A]) extends Action[A] {
    def apply(request: Request[A]): Future[Result] = {
      if(cache.contains(key)){
        Logger.info("Found key: " + key)
      }
      action(request)
    }
    lazy val parser = action.parser
}

def cached(p1: String) = Caching(key = p1, time = 100 millis){
    Action.async { Future(Ok("hello")) }
    //or
    Action { Ok("hello") }
}

带有两个参数列表的Case类看起来很奇怪,但它有效。 文档:https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition#Composing-actions