我正在尝试创建一个自定义play.api.mvc.Action
,可用于CustomerAccount
根据请求填充 a 并将其传递CustomerAccount
到控制器中。
按照Play 2.2.x 的文档,我创建了一个Action
,ActionBuilder
但我似乎无法CustomerAccount
从操作中返回。
我目前的代码是:
case class AccountWrappedRequest[A](account: CustomerAccount, request: Request[A]) extends WrappedRequest[A](request)
case class Account[A](action: Action[A]) extends Action[A] {
lazy val parser = action.parser
def apply(request: Request[A]): Future[SimpleResult] = {
AccountService.getBySubdomain(request.host).map { account =>
// Do something to return the account like return a new AccountWrappedRequest?
action(AccountWrappedRequest(account, request))
} getOrElse {
Future.successful(NotFound(views.html.account_not_found()))
}
}
}
object AccountAction extends ActionBuilder[AccountWrappedRequest] {
def invokeBlock[A](request: Request[A], block: (AccountWrappedRequest[A]) => Future[SimpleResult]) = {
// Or here to pass it to the next request?
block(request) // block(AccountWrappedRequest(account??, request))
}
override def composeAction[A](action: Action[A]) = Account(action)
}
注意:这不会编译,因为该block(request)
函数需要一种AccountWrappedRequest
我无法填充的类型。使用直线时会编译Request
此外...
最终,我希望能够将此帐户操作与身份验证操作结合起来,以便CustomerAccount
可以将其传递到身份验证操作中,并且可以根据该客户的帐户提供用户身份验证。然后我想将客户帐户和用户传递给控制器。
例如:
Account(Authenticated(Action))) { request => request.account; request.user ... }
或者更好的是作为不需要自定义请求对象的单个对象。