Я предполагаю, что ваша конкретная цель - эффективно собрать все данные относительно незарегистрированного пользователя в каждом из ваших заинтересованных действий контроллера. Проблема: мы хотим получить сборку UnregisteredUser
, напрямую собирающую все эти данные в сеансе.
Во-первых, сохраняйте данные UnregisteredUser
, когда захотите, в сеансе, используя базовый API Play 2 сеансы. :
Ok("Welcome Guest User!").withSession(
"email" -> "unregisteredUserEmail" // assuming a randomly chosen Id since not logged yet
// many other data here
)
Затем вы можете просто написать trait
, расширяющий вашу фактическую черту SecureSocial
, содержащую:
case class GuestRequest[A](optUnregisteredUser: Option[UnregisteredUser], request: Request[A]) extends WrappedRequest(request)
def GuestAction(f: GuestRequest[AnyContent] => Result): Action[AnyContent] = {
implicit request => {
val optUnregisteredUserEmail = session.get("currentUnregisteredUser")
val unregisteredUser = UnregisteredUser(optUnregisteredUserEmail)
f(GuestRequest(optUnregisteredUser, request))
}
В каждом из ваших заинтересованных контроллеров вы просто сделаете:
def addToCard = GuestAction {
implicit request =>
val currentUnregisteredUser: UnregisteredUser = optUnregisteredUser.getOrElse(.....)
//remaining instructions here
}
--------------ОБНОВЛЕНИЕ--------------
Действительно, вы можете использовать UserAwareAction
из существующей черты SecureSocial
для обоих пользовательских стилей. Таким образом, вы должны переопределить UserAwareAction
в своем трейте, расширяющем SecureSocial, чтобы объединить функции:
override def UserAwareAction[A](p: BodyParser[A])(f: RequestWithUser[A] => Result) = Action(p) {
implicit request => {
val user = for (
authenticator <- authenticatorFromRequest;
user <- userServices.findByUserName(authenticator.userName)
) yield {
touch(authenticator)
user
}
if(user.isEmpty){ //meaning user is not logged
f(RequestWithUser(tryToBuildUnRegisteredUser, request)) //setting your unregisteredUser
}
else{
f(RequestWithUser(user, request))
}
}
}
private def tryToBuildUnregisteredUser = {
val optUnregisteredUserEmail = session.get("currentUnregisteredUser")
optUnregisteredUserEmail match {
case Some(e) => Some(UnregisteredUser(e))
case _ => None
}
}
Конечно, вы можете изменить его :)
person
Mik378
schedule
13.05.2013