get/setFlashのコードを追ってみる
2008年07月22日(火)09:46|那須
那須です。
Symfonyには一時的にセッションでデータを保持するためにフラッシュパラメーターという機能があります。
セッションを使う場合に常に意識しなければ問題として、格納したデータをどのタイミングで消すかということがあります。ですが、フラッシュパラメータは、データを格納した次のリクエストの処理が完了後、セッションデータを自動的に削除してくれます。 私は、削除処理を意識しなくてよいので頻繁にフラッシュパラメーターを使うのですが、どうやってデータを削除しているのかが気になり、Symfonyのコードを調べてみました。
フラッシュパラメータの利用方法
まず、簡単にフラッシュパラメーターの使い方を説明します。といっても至って単純で、Actions内で
$this->setFlash(‘key’, ‘foo’);
でセットし
$this->getFlash(‘key’);
で取り出すだけです。
フラッシュパラメータの仕組み
フラッシュパラメータは、永続的なセッションとは区別して扱われますが、実態はセッション変数の1つになります。
Symfonyでは、フラッシュパラメータを sfFlashFilter というfilterで、ワンタイムセッションとして扱えるようにします。また、ActionsのメソッドであるsetFlash()、getFlash()は、Actionsの上位クラスにあたる sfComponentで定義されています。
sfComponent
まずは、プログラマに身近なところ(フラッシュパラメータのためのメソッド)から見ていきます。
setFlash
public function setFlash($name, $value, $persist = true) { $this->getUser()->setAttribute($name, $value, ’symfony/flash’); if ($persist) { // clear removal flag $this->getUser()->getAttributeHolder()->remove($name, ’symfony/flash/remove’); } else { $this->getUser()->setAttribute($name, true, ’symfony/flash/remove’); } }
getFlash
public function getFlash($name) { return $this->getUser()->getAttribute($name, null, ’symfony/flash’); }
セッションにsymfony/flash という名前空間を用意して、そこにデータを設定したりするだけのメソッドです。 setFlashで、symfony/flash/removeという名前空間にデータをセットしています。この symfony/flash/remove という名前空間がワンタイムのセッションデータとして機能するために重要になります。これについては後述します。
sfFlashFilter
sfFlashFilterは、前処理と後処理があります。
まず、前処理で現在定義されているフラッシュパラメータを調べ、それを削除候補リストに入れます。さきほど、symfony/flash/remove というセッションの名前空間が重要と書きましたが、symfony/flash/removeという名前空間が削除候補リストにあたります。
その後、他のfilterやActionを経由後、後処理で削除候補リストにあるフラッシュパラメータを削除します。
コードを眺めてみると、案外まどろっこしいことをしていることがわかりました。ただ、Symfony以外で、ワンタイムのセッションデータを使いたい場合などの参考になるかと思います。
追記
上記は Symfony1.0系の話です。Symfony1.1系では、フラッシュパラメータの取り扱いがUserクラスに取りまとめられたらしく、また別の動きになっているかと思います。