Play2 Framework的文档建议建立一个像这样的新动作:
class UserRequest[A](val user: Option[User], request: Request[A]) extends WrappedRequest[A](request)
object AuthAction extends ActionBuilder[UserRequest] {
def invokeBlock[A](request: Request[A], block: (UserRequest[A]) => Future[Result]) = {
val user = User(some data...)
block(new UserRequest(Some(user),request))
}
}
现在我找到了一个完全不同的博客。请看这里: http://bryangilbert.com/code/2013/07/05/action-composition-auth/
看看这个街区。
def FacebookAuthenticated(f: FacebookAuthenticatedRequest => Result) = {
Action { request => .....
不使用ActionBuilder,而是定义一个仅在内部使用Action的独立函数。对我来说,博客中的Action组合看起来更方便。此外,它还可以将参数传递给新函数。
现在我的问题是:扩展ActionBuilder而不是在博客中使用这项技术有什么好处吗?
答案 0 :(得分:1)
如果你有可能进行异步操作(Request => Future[Result]
)然后接受不同的身体解析器(BodyParser[T] => Request[T] => Future[Result]
),你可能会得到与ActionBuilder
一样复杂的东西。
您可能最终会得到一种语法来覆盖与动作构建器完全相同的所有情况,或者可能会使其他开发人员感到困惑的非常不同,但这可能不是一个大问题。
如果您的需求一样简单,总是相同,Result
或Future[Result]
没有身体解析器,那么它可能非常适合您。如果你在未来发现一些问题,那么改为使用ActionBuilder
可能不会有太多工作。