【问题标题】:Load the User object on each request in a controller, how to make this object available?在控制器中的每个请求上加载用户对象,如何使该对象可用?
【发布时间】:2025-12-12 00:25:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scala playframework playframework-2.2


    【解决方案1】:

    我不确定你能否让它像 Rails 一样简洁,但使用 Play 的 Action Composition 样式,你可以构建一些相当灵活的东西。

    我们首先创建一个知道如何构建这样一个用户的特征,并包装一个普通的Action,允许获取用户并将其传递到主体中:

    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 包装器,一个委托给另一个。不同之处在于您是否需要特殊的正文解析器。下面你会看到它在使用中。

    第二个UserAction 方法很有趣——如果你为它提供一个可以接受UserRequest 的方法,它会在创建用户后为你调用它,或者如果它轰炸了它找不到 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}")
      }
    }
    

    使用重载的UserActions,您仍然可以使用 Play 的 Body Parsers 来访问类型良好的请求正文,并且您可以使用新创建的 User user

    【讨论】:

      最近更新 更多