Scala 在控制器中的每个请求上加载用户对象,如何使该对象可用?

Scala 在控制器中的每个请求上加载用户对象,如何使该对象可用?,scala,playframework,playframework-2.2,Scala,Playframework,Playframework 2.2,据我所知,游戏中的控制器都是单例的,所以我不知道该怎么做 在Rails中,我可以简单地在base_控制器中加载一个用户,然后在从base_控制器继承的任何控制器中,用户对象都可以供我使用 在游戏中,我不确定这将如何工作。基本上,在控制器中的每个动作中,我希望用户对象对我可用 def someAction = { val name = user.name val age = user.age Ok("hello") } 这在游戏中可能吗?我肯定是这样,但我似乎不知道如何做

据我所知,游戏中的控制器都是单例的,所以我不知道该怎么做

在Rails中,我可以简单地在base_控制器中加载一个用户,然后在从base_控制器继承的任何控制器中,用户对象都可以供我使用

在游戏中,我不确定这将如何工作。基本上,在控制器中的每个动作中,我希望用户对象对我可用

def someAction = {
    val name = user.name
    val age = user.age
    Ok("hello")
}

这在游戏中可能吗?我肯定是这样,但我似乎不知道如何做到这一点。

我不确定您是否能够使它像Rails一样简洁,但使用Play的风格,您可以构建一些非常灵活的功能

我们首先创建一个知道如何构建这样一个用户的特征,并包装一个正常的
动作
,允许用户获得并传递到身体中:

trait UserAware {

  def buildUserFromCookie(request:RequestHeader):Option[User] = {

    request.cookies.get("myUserCookie").map { c =>
      // Build up a User object from cookie contents
      // ...
    }
  }

  def cookieNotFound = Results.InternalServerError("Lost your session cookie :-(")

  def UserAction(f: User => Request[AnyContent] => SimpleResult):Action[AnyContent] =
    UserAction[AnyContent](BodyParsers.parse.anyContent)(f)

  def UserAction[T](bodyParser:BodyParser[T])(f: (User) => Request[T] => SimpleResult):Action[T] = {
    Action(bodyParser) { request =>
      buildUserFromCookie(request).fold(cookieNotFound) ({ user =>
        f(user)(request)
      })
    }
  }
}
我假设您有一个会话cookie,它保存了足够的信息,可以重新创建用户对象。您需要在
buildUserFromCookie()
中执行的任何操作都超出了此处的范围

我定义了两个
UserAction
wrapper,一个委托给另一个。区别在于是否需要特殊的主体解析器。下面您将看到它正在使用中

第二个
UserAction
方法很有趣-如果您为它提供了一个可以接受
User
Request
的方法,它将在创建用户后为您调用它,或者在找不到cookie时将其炸掉

现在正在使用:

object MyController extends Controller with UserAware {

  def doSomething = UserAction { implicit user => implicit request =>
    Ok(s"The user's name is $user.")
  }

  def doSomethingJsonish = UserAction(parse.json) { implicit user => implicit request =>
    Ok(s"The user's name is $user and their request body is JSON: ${request.body}")
  }
}
使用重载的
UserAction
s,您仍然可以使用Play的Body解析器来访问输入良好的请求Body,并且您已经获得了新创建的
User
作为
User
提供