セッション管理
セッション管理については特にscala版の特記事項は無い模様。つまり、Java版と同じらしい。 また、セッションをキャッシュとして使わないよう、playはキャッシュ機構を備えている。
フラッシュスコープとは
いきなりフラッシュスコープという耳慣れない言葉が出てくるが、以下に参考を示す。
例えば、フォームをサブミットし、その内容がエラーだった場合、エラーページにリダイレクトするが、その際のメッセージをエラーページに受け渡すためには、以下のいずれかを行わなければならない。
- エラーメッセージをパラメータとして受け渡す。
- エラーメッセージをセッションに保存し、エラーページにて表示した後にそれを消す。
フラッシュスコープを利用すると以下のような動作になるようだ。
- エラー内容をフラッシュスコープに保存する
- エラーページにリダイレクトする
- エラーページでエラー内容を表示する
- フラッシュスコープの内容は自動的に消える
セッションの使い方
play.mvc.ScalaControllerには、以下のような定義がある。
implicit def request = Request.current() implicit def response = Response.current() implicit def session = Session.current() implicit def flash = Flash.current() implicit def params = Params.current() implicit def renderArgs = RenderArgs.current() implicit def validation = Validation.current()
通常、コントローラは
object Application extends Controller { import views.Application._ case class User(name: String, addr: String) def index() = html.index("Your Scala application is ready!") }
などと記述されるが、このControllerは実はplay.mvc.packageにて「 type Controller = ScalaController」とされており、ScalaControllerのことになる。
つまり、上記コントローラコード中で、sessionを参照すると、これはSession.current()になる。Sessionは play.mvc.Scope.Sessionのこと。
おそらく、put(key: String, value: String)を呼び出せばセッションに名前付文字列を保持することができる。
キャッシュの利用
セッションには極めて小さな文字列しか保存できず、大きなデータやバイナリを保存するにはキャッシュを用いる必要がある。 ただし、ユーザごとに個別のセッション保持領域とは異なり、キャッシュはplay環境でグローバルであることに注意。 ユーザごと(セッションごと)の情報を保持するには、セッションのIDをキャッシュ用キーに含める必要がある。 もちろん、ユーザが識別できれば何でもよい。
※注意:Cacheというクラスは、実際にはScalaCacheを参照する(Controllerが実際にはScalaControllerであるように)。 例えばgetの戻り値がOption[T]となっているので注意しなければならない。