Symfony 4.4 で動作確認
PHPのフレームワーク、Symfonyでのフラッシュメッセージの実装方法、使い方などの解説をしたいと思います。
フラッシュメッセージ(flash message)とはエラーなどがあった場合に、ちょっと画面に表示したいときに便利な機能です。
基本的には一度きり表示してリロードした場合は削除するケースが多いと思います。
Controllerの記述
フラッシュメッセージはセッションで管理されています。
参考: Session Management
コントローラ側のコード
$this->addFlash('notice', 'test notice'); // or $this->get('session')->getFlashBag()->add('notice', 'test notice');
簡単ですね。これでセッションにフラッシュメッセージが格納されました。
フラッシュメッセージを表示する設定がされている画面を開くことでメッセージが表示されます。
Twigテンプレートの記述
SymfonyのデフォルトテンプレートであるTwigの場合です。
{% for message in app.flashes('notice') %} <div> {{ message }} </div> {% endfor %} // or {% for message in app.session.flashBag.get('notice') %} <div> {{ message }} </div> {% endfor %}
テンプレート側は、フラッシュメッセージが配列で格納されているので「for」などで記述します。
下の書き方は、flashBag以外にもSessionApiを参照できるので覚えておくと便利です。
フラッシュメッセージ関連その他トピックス
■フラッシュメッセージを表示したときにセッションから削除したくない場合
peek
を使うことで、表示してもセッションから削除されません。
{% for message in app.session.flashBag.peek('notice') %} <div> {{ message }} </div> {% endfor %}
応用で、コントローラ側でフラッシュメッセージを取得して、セッションから削除したくない場合も使えます。
// not clear from session $message = $this->container->get('session')->getFlashBag()->peek('notice'); // clear from session $message = $this->container->get('session')->getFlashBag()->get('notice');
普通に削除したい場合は、get
を使います。
■フラッシュメッセージがセッションに存在するか確認する
has
を使うとフラッシュメッセージがある場合、trueを返却します。
// Controller $isMessage = $this->container->get('session')->getFlashBag()->has('notice'); // Template {% if app.session.flashbag.has('notice') %} <div> {{ message }} </div> {% endif %}
■$_SESSION
から取得する方法
dumpしていただければすぐわかりますが、$_SESSION['_symfony_flashes']
でもフラッシュメッセージ内のデータが取得可能です。
以上Symfonyのフラッシュメッセージの解説でした。
Symfonyおすすめ書籍
あまり種類がないのと、そもそもフレームワークとして情報が膨大なので、入門でも結構読み応えがあります。
「PHPフレームワーク Symfony 4入門」