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

How to send a parameter to a custom action?

我正在使用 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 为操作提供了缓存,不幸的是缓存不满足所有要求。

我不确定 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") }
}

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