Play2 for Scala:Action Chaining是一个缺失的功能吗?

时间:2014-03-10 21:17:55

标签: scala playframework-2.0

几天前,我遇到了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上写一些类似的东西,但我想知道它是否真的是一个缺失的功能,如果你们中的一些人已经实现了类似的东西。

最后:你觉得在框架中有什么好处吗?

2 个答案:

答案 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
  }

}