【symfony2】Flash Messageの落とし穴
Flash MessageとはWebアプリにおいて、ユーザーが何らかの操作を行った際に
動作結果などをユーザーに知らせる為に表示される簡易的なメッセージ機能のことです。
Webサイトを日常的に利用される方であれば「編集が完了しました」、
「エラーが発生しました」などの表示を一度は見た事があるのではないでしょうか。
symfony2には標準でFlash Message機能が存在しています。
※Flash Message機能については以前、下記の記事内でも紹介しています。
【symfony2.3】仕様変更のまとめその2
今回はそんなFlash Message機能に関する落とし穴について記事を書きたいと思います。
Flash Messageをセット(Controller)
これで「system_error」というFlash Messageに「エラーが発生しました」という文言がセットされます。
1 | $this->get('session')->getFlashBag()->set("system_error", "エラーが発生しました"); |
Flash Messageを取得(Template)
これで「system_error」というFlash Messageがtwigで取得・表示できます。
※なお、セットした値が一つでもapp.session.flashbag.getの返り値は配列です。
1 2 3 | {% for flashMessage in app.session.flashbag.get('system_error') %} {{ flashMessage }} {% endfor %} |
思わぬ落とし穴
ここまでの基本動作は明快で特につまづく個所はなかったかと思います。
しかし、ここに落とし穴が存在していました。
前項で説明したapp.session.flashbag.getを同一テンプレート内で二回以上、
行おうとすると、Flash Messageが返って来ず、空白の配列が返ってきてしまいます。
解消方法
原因はapp.session.flashbag.getの仕様にありました。
getメソッドでFlash Messageを取得するとその時点でそのFlash Messageは消滅してしまいます。
以下のようにpeekメソッドを使用する事で、複数回Flash Messageを取得できます。
1 2 3 | {% for flashMessage in app.session.flashbag.peek('system_error') %} {{ flashMessage }} {% endfor %} |
Author Profile
スターフィールド編集部
SHARE