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入門」