フラッシュメッセージの実装方法[Symfony]

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