如何将参数发送到自定义操作?
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 为操作提供了缓存,不幸的是缓存不满足所有要求。
我不确定 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") }
}
带有两个参数列表的案例 class 看起来很奇怪,但它确实有效。
文档:https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition#Composing-actions
我正在使用 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 为操作提供了缓存,不幸的是缓存不满足所有要求。
我不确定 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") }
}
带有两个参数列表的案例 class 看起来很奇怪,但它确实有效。 文档:https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition#Composing-actions