Используя композицию действий Play, мне интересно, есть ли способ добавить поля в запрос за несколько ActionTransformer
с, чтобы я мог получить доступ к обоим полям в запросе.
Простой пример, который не не работает:
import scala.concurrent.{ExecutionContext, Future}
import play.api.mvc.{Action, ActionTransformer, Request, Results, WrappedRequest}
class RequestWithName[A](request: Request[A], val name: String) extends WrappedRequest[A](request)
def addName(implicit ec: ExecutionContext) = new ActionTransformer[Request, RequestWithName] {
override def executionContext: ExecutionContext = ec
override def transform[A](request: Request[A]): Future[RequestWithName[A]] = ???
}
class RequestWithUserId[A](request: Request[A], val userId: String) extends WrappedRequest[A](request)
def addUserId(implicit ec: ExecutionContext) = new ActionTransformer[Request, RequestWithUserId] {
override def executionContext: ExecutionContext = ec
override def transform[A](request: Request[A]): Future[RequestWithUserId[A]] = ???
}
Action.andThen(addName).andThen(addUserId) { req =>
Results.Ok(req.name + req.userId) // compile error: name not available
}
Action.andThen(addUserId).andThen(addName) { req =>
Results.Ok(req.name + req.userId) // compile error: userId not available
}
Имеет смысл, почему происходят эти ошибки компиляции - последний andThen
возвращает ActionTransformer
, который имеет только одно из двух полей. Но есть ли способ совершить одно и то же, не сообщая им друг о друге? Например. Я мог бы добавить RequestWithUserIdAndName
- но тогда я не могу составить это с другими преобразованиями, которые добавляют еще больше полей.