几天前,我遇到了Play最终缺失的功能,即Action Chaining。这就是我的意思:
我有一个带有两个动作的控制器,我想从另一个动作调用一个动作以保持DRY。我的目标是在用户登录后自动签名。
object MyController extends Controller {
def signOn = Action {
// ... do stuff to sign the user on
signIn // call the next Action
}
def signIn = Action {
// ... do stuff to sign the user in
Ok("Welcome, Dude!")
}
}
我在这里找到了这个不错但过时的解决方案(适用于Play 2.0.x)
http://www.natalinobusa.com/2012/07/chained-actions-in-play-framework-20.html
现在我正在尝试在Play 2.2.x上写一些类似的东西,但我想知道它是否真的是一个缺失的功能,如果你们中的一些人已经实现了类似的东西。
最后:你觉得在框架中有什么好处吗?
答案 0 :(得分:1)
这样做怎么样?
def signOn = Action.async { request =>
// ... do stuff to sign the user on
signIn(request) // call the next Action
}
def signIn = Action {
// ... do stuff to sign the user in
Ok("Welcome, Dude!")
}
答案 1 :(得分:0)
Johan提出的解决方案正是我所寻求的。对于一个整洁的链式动作控制器,我最终得到了这个(好的?)解决方案
package controllers
import play.api._
import play.api.mvc._
object TestCtrl extends Controller {
def signOn = Action.async { request =>
// ... do stuff to sign the user on
if ( true )
signIn(request) // call the next Action
else
stopChaining( Ok("Stop") )(request)
}
def signIn = Action {
// ... do stuff to sign the user in
Ok("Welcome, Dude!")
}
private def stopChaining(result: SimpleResult) = Action {
// ... do nothing, just return the result
result
}
}