あなたの特定の目標は、関心のあるコントローラーの各アクションで、未登録のユーザーに関連するデータ全体を効率的に収集することだと思います。UnregisteredUser
問題:セッションでこれらすべてのデータを直接収集するビルドを取得したいと考えています。
UnregisteredUser
まず、基本的な Play 2 の API Sessionsを使用して、セッションでいつでもデータを永続化します。
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
実際、両方の User スタイルにfrom existing SecureSocial
trait を使用できます。したがって、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
}
}
もちろん、自由にリファクタリングできます:)