やかんブログ

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クラスに取りまとめられたらしく、また別の動きになっているかと思います。

この記事に関するお問い合わせはこちら

ページの先頭へ