SymfonyのFlashメッセージ完全ガイド!初心者でもわかる通知の仕組みと使い方
生徒
「Symfonyでボタンを押したときに『保存しました』みたいな通知って出せるんですか?」
先生
「はい、Symfonyでは『Flashメッセージ』という仕組みを使って、ユーザーに一時的な通知を表示することができますよ。」
生徒
「Flashメッセージって何ですか?難しくないですか?」
先生
「大丈夫です。とてもシンプルな仕組みなので、初心者の方でもすぐに使えるようになりますよ。では一緒に見ていきましょう!」
1. Flashメッセージとは?
Flashメッセージ(フラッシュメッセージ)とは、Symfonyで一時的にユーザーへ通知を伝えるための仕組みです。最大の特徴は「一度だけ表示されて、自動的に消える」点にあります。たとえば、フォーム送信後に「登録が完了しました」「更新に失敗しました」といった結果を、次の画面で分かりやすく伝えたいときによく使われます。
通常、画面遷移(ページ移動)をすると、直前の処理結果は消えてしまいます。しかしFlashメッセージを使うことで、ページを移動したあとでも処理結果をユーザーに伝えられるようになります。「今の操作が成功したのか失敗したのか」を知らせる役割を持つ、と考えるとイメージしやすいでしょう。
仕組みとしては、メッセージを一時的にセッションへ保存し、次の画面で表示したあとに自動で削除されます。そのため、何度も同じ通知が表示されることはありません。
たとえば、コントローラで次のようにFlashメッセージを設定すると、次のページで一度だけ表示されます。
$this->addFlash('success', '登録が完了しました');
この1行だけで「通知をセットする」ことができるのがFlashメッセージの魅力です。難しい処理はなく、初心者でもユーザーに分かりやすいフィードバックを簡単に追加できる便利な機能だと覚えておきましょう。
2. Flashメッセージが使われる場面
Flashメッセージは、「ユーザーの操作結果をその場で分かりやすく伝えたいとき」に活躍します。特に、画面遷移を伴う処理では結果が見えにくくなるため、Flashメッセージがあることでユーザーは安心して操作を続けられます。
実際によく使われる場面としては、次のようなケースがあります。
- ユーザー登録や会員情報の更新が正常に完了したことを伝えたいとき
- フォーム入力に不備があり、処理が失敗したことを知らせたいとき
- ログイン・ログアウト後に、状態が切り替わったことを表示したいとき
- データ削除や変更など、重要な操作が完了したことを確認してもらいたいとき
たとえば「保存ボタンを押したけれど、ちゃんと保存できたのか不安…」という状況でも、画面上に「保存しました」と表示されれば、ユーザーは迷わず次の操作に進めます。このように、Flashメッセージは操作結果を補足する役割を持っています。
初心者のうちは、「処理が終わったあとに一言メッセージを出したい場面」でFlashメッセージを使う、と覚えておくと理解しやすいでしょう。
3. Flashメッセージをコントローラで設定する方法
Flashメッセージは、Symfonyのコントローラで「通知文を一時的に保存する」ことで使えるようになります。ポイントは、処理が終わったタイミングでメッセージをセットしておき、次の画面で表示させる流れにすることです。難しく考えず、「保存できたよ」「失敗したよ」と一言メモを残すイメージでOKです。
基本は、コントローラ内でaddFlash()を呼び出します。たとえば「保存に成功しました」と表示したい場合は、次のように書きます。
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class SampleController extends AbstractController
{
#[Route('/flash/set', name: 'flash_set')]
public function setFlashMessage(): Response
{
// 1回だけ表示したいメッセージをセット
$this->addFlash('success', 'データの保存に成功しました!');
// 次の画面へ移動(移動先でメッセージが表示される)
return $this->redirectToRoute('flash_show');
}
}
addFlash()の最初の引数はメッセージの種類(ラベル)です。ここで指定したsuccessやerrorが、表示側でデザインを変える目印になります。2番目の引数が、実際に画面へ出したい文章です。
そして大事なのが、addFlash()のあとにredirectToRoute()などで画面遷移を入れることです。Flashメッセージは「次のリクエストで表示して消える」仕組みなので、同じ画面をそのまま表示するより、リダイレクトの形にすると分かりやすく確実です。
4. Twigテンプレートでメッセージを表示する方法
Flashメッセージをセットしただけでは、画面には何も出ません。最後に「表示する側」として、Twigテンプレートに出力の処理を書いておく必要があります。やることはシンプルで、Symfonyが用意しているapp.flashesをループして、メッセージを順番に画面へ表示するだけです。
まずは基本形です。コントローラでaddFlash('success', '...')のように登録したメッセージを、次のように取り出して表示します。
{% for label, messages in app.flashes %}
{% for message in messages %}
<div class="alert alert-{{ label }}">
{{ message }}
</div>
{% endfor %}
{% endfor %}
ここでのポイントは2つあります。1つ目は、labelにsuccess / error / warningのような「種類」が入ること。2つ目は、同じ種類のメッセージが複数入る場合があるので、messagesをもう一段ループしていることです。
また、表示の見た目を整えるなら、Bootstrapのアラートと相性が良いです。たとえばsuccessなら緑、dangerなら赤というように、メッセージの種類ごとに直感的に区別できます。上の例はalert alert-{{ label }}としているので、ラベル名をそのままクラスに流し込めて手軽です。
初めてのうちは、まずこのTwigを「表示したいページ」に貼り付けて、通知が出ることを確認しましょう。通知が一度表示されたら消えるのがFlashメッセージの仕様なので、リロードして消えるのも正常な動きです。
5. 実際の表示イメージ
たとえば、データを保存したあとの画面で次のように表示されます。
データの保存に成功しました!
これは、ユーザーに対して操作が成功したことを知らせるとても重要なフィードバックです。
6. Flashメッセージの種類とデザインの工夫
Flashメッセージの種類(label)には、よく以下のようなものが使われます:
success(成功)→ 緑色で表示errorまたはdanger(エラー)→ 赤色で表示warning(注意)→ 黄色で表示info(情報)→ 青色で表示
Bootstrapと一緒に使うことで、視覚的にもわかりやすくなります。
7. Flashメッセージの注意点
Flashメッセージは一度だけ表示されるのが特徴です。画面をリロードしたり、別のページに移動すると消えてしまいます。
また、メッセージが設定されるのは「リダイレクト後」の画面である必要があります。そのため、addFlash()を設定したあとにはredirectToRoute()などで画面遷移を行うのが一般的です。
8. Flashメッセージが表示されないときのチェックポイント
もしFlashメッセージが表示されないときは、次の点をチェックしてみましょう:
- リダイレクト先のテンプレートに
app.flashesのループがあるか? - セッションが有効になっているか?
addFlash()を記述したあとにきちんとリダイレクトしているか?
エラーが出ている場合は、Symfonyのログファイル(var/log/dev.log)も確認してみましょう。