我正在使用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为操作提供了缓存,遗憾的是缓存不能满足所有要求。
答案 0 :(得分:1)
我不确定ActionBuilder
或ActionRefiner
的解决方案,但这可能对您有用:
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