| この記事の要点 |
|
やりたいこと
フォームの送信後に「登録が完了しました」「削除しました」といったメッセージを、次の画面で 1 回だけ表示したい場面はよくあります。Laravel ではこれをフラッシュデータ(次のリクエストまでだけ保持されるセッションの値)で実現します。
どの方法を使うべきかは、コントローラーの最後が redirect なのか return view なのかで変わります。
| コントローラーの返し方 | 使う方法 | メッセージの寿命 |
|---|---|---|
| redirect / back | ->with('message', '...') | リダイレクト先の 1 リクエストだけ |
| return view | session()->now('message', '...') またはビュー変数 | 今回のリクエストだけ |
| (汎用) | session()->flash('message', '...') | 今回と次のリクエスト |
方法 1: redirect にメッセージを付ける(推奨)
POST の処理後はリダイレクトして画面を表示し直すのが定石です(PRG パターン。再読み込みで二重送信されるのを防げます)。リダイレクトレスポンスの with() は、値をフラッシュデータとしてセッションに保存します。
public function store(Request $request)
{
$user = User::create($request->validated());
return redirect()
->route('users.show', $user)
->with('message', 'ユーザーを登録しました');
}
元の画面に戻すなら back() にも同じように付けられます。
return back()->with('message', '更新しました');
// Laravel 9 以降は to_route() でも書ける
return to_route('users.index')->with('message', '削除しました');
方法 2: return view で表示する場合
リダイレクトせず、そのままビューを返してメッセージを表示したい場合は、今回のリクエストだけ有効な session()->now() を使います。
session()->now('message', 'メッセージ');
return view('user', [
'user' => $user,
]);
セッションを使わず、ビュー変数として渡しても構いません。この場合、Blade 側では session('message') ではなく $message で参照します。
return view('user', [
'user' => $user,
'message' => 'メッセージ',
]);
flash() の直後に return view するとメッセージが二重に出る
次のように session()->flash() の直後に return view しても、今回の画面にはメッセージが表示されます。
session()->flash('message', 'メッセージ');
return view('user', [
'user' => $user,
]);
ただしフラッシュデータは「次のリクエストまで」保持されるため、ユーザーが次に別のページを開いたときにも同じメッセージがもう一度表示されます。「メッセージが 2 回出る」という不具合の多くはこれが原因です。return view で使うなら now()、リダイレクトするなら with() と使い分けてください。
View(Blade)での表示
@if (session('message'))
<div class="alert alert-success">
{{ session('message') }}
</div>
@endif
{{ }} は自動で HTML エスケープされるため、メッセージにユーザー入力を含めても安全です。Laravel 11 以降では @session ディレクティブでも書けます。
@session('message')
<div class="alert alert-success">{{ $value }}</div>
@endsession
成功とエラーでキーを分ける
キーを分けておくと、見た目を切り替えやすくなります。共通レイアウト(例: layouts/app.blade.php)に一度書けば、全ページで使えます。
@foreach (['success', 'error', 'warning'] as $type)
@if (session($type))
<div class="alert alert-{{ $type === 'error' ? 'danger' : $type }}">
{{ session($type) }}
</div>
@endif
@endforeach
return back()->with('error', '在庫が不足しています');
うまく表示されないときの確認ポイント
- ルートに web ミドルウェアが付いているか: セッションは web ミドルウェアグループで有効になります。
routes/api.phpのルートではフラッシュメッセージは使えません - リダイレクトが 2 回以上連続していないか: リダイレクト先がさらにリダイレクトすると、最初の遷移でフラッシュデータが消費されて表示されません
- キー名の一致:
with('message')とsession('msg')のようにキー名がずれていないか - バリデーションエラーは別の仕組み:
$request->validate()の失敗時は$errors変数に入ります。自分でエラーを返すならback()->withErrors([...])->withInput()を使います
セッションの中身を確認したいときは、Blade に一時的に @dump(session()->all()) を書くと、どのキーが入っているかが分かります。
関連
- Laravel Blade @if 条件分岐の使い方完全ガイド
- Laravel「The page has expired due to inactivity」の原因と対処
- Spring MVC で Model に値を入れてビューへ渡す方法|RedirectAttributes
- Django のリダイレクト|redirect() と PRG パターン・301 の注意
子ページはありません
- インストールと設定
- クイックスタート & チュートリアル(初心者向け)
- クイックスタート & チュートリアル(中級者向け)
- ルーティング
- Bladeテンプレート(ビュー/レイアウト)
- コントローラー
- マイグレーションとテーブル定義
- データベースの設定
- Eloquentモデル (ORM)
- SQLとクエリビルダー
- バリデーション
- .envファイルの設定値へのアクセス
- 動作環境による分岐処理
- configフォルダ配下の設定値へのアクセス
- assetヘルパーを利用したpublicフォルダへのアクセス
- storageフォルダへのアクセス
- アプリケーション名の変更
- メンテナンス
- ログイン画面(認証システム)の作成
- ログインの必須化
- ログインユーザー情報の取得
- ルートの認証化
- 本番サーバーへのデプロイ方法
- 多言語化
- csrf_field
- ファイルのダウンロード
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- ページタイトルの設定
- コマンド一覧
- エラー一覧
- SQLの実行ログ出力方法
- キャッシュのクリア
- Selectの結果の最初もしくは最後に任意の値を追加する方法
- ajaxでPOST通信する際の注意点
- ソーシャルログインの実装
- セッション情報の確認
- ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
- redirectやreturn viewにメッセージを付与する方法
- クッキー(cookie)の設定と取得
- クラスの再読み込み
- csrfの有効時間を変更する方法
- ViewComposerを用いてviewに共通の値を付与する方法
- View::shareを用いて共通の値を各ビューに渡す方法
- ミドルウェアを用いた処理の共通化
- Middleware内でAuth::check()などを使用する方法
- Controller以外でリダイレクトする方法
- セッションの値の取得/保存/更新/削除
- $requestの値を変更する方法
- 常時SSL化
- ページング(ページネーション)をする方法
- vue.jsとの連携
- Vue.jsと連携するSPA実行環境構築
- .envの値をvue.jsで参照する方法
- vue.jsを本番環境にリリースする方法
- could not find driver(Windows, MySQL編)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38