Scala 在控制器中的每个请求上加载用户对象,如何使该对象可用?
据我所知,游戏中的控制器都是单例的,所以我不知道该怎么做 在Rails中,我可以简单地在base_控制器中加载一个用户,然后在从base_控制器继承的任何控制器中,用户对象都可以供我使用 在游戏中,我不确定这将如何工作。基本上,在控制器中的每个动作中,我希望用户对象对我可用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") } 这在游戏中可能吗?我肯定是这样,但我似乎不知道如何做
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
提供