概要
エラーメッセージや完了メッセージなどを表示したい時にアラートを表示したりしますが、リロードした時には表示させたくないので、フラッシュメッセージを使いたい場面が多々あると思います。Laravelでも簡単にフラッシュメッセージを出すことができるのですが、コントローラーでのreturn redirect
とreturn view
ではフラッシュメッセージの振る舞いが変わるので、まとめておきます。
動作環境
Laravel 5.8
前提知識
まずController
からview
にデータを受け渡す方法として、今回の記事では2種類扱っています。
- Controllerからviewに受け渡す変数
- PHPのSession
前者はviewでデータを表示させるために普段使うやつです。コードでは以下のような使い方をします。
publicfunctionindex(){returnview('home.index')->with('message','Hello!');}
<p>{{ message }}</p>
後者はPHPのセッションを用いてデータをやりとりする方法です。上と同じメッセージをセッションで実現すると下の通りになります。
publicfunctionindex(){Session::put('message','Hello!');returnview('home.index');}
@if (Session::has('message'))
<p>{{ session('message') }}</p>
@endif
本題
フラッシュメッセージを扱う時にはセッションを用います。
Controllerの処理
リダイレクトする場合
publicfunctionredirect(){returnredirect()->route('home')->with('message','Hello!');}
ビューを返す場合
publicfunctionindex(){Session::flash('message','Hello!');returnview('home.index');}
Viewの処理
@if (Session::has('message'))
<p>{{ session('message') }}</p>
@endif
ややこしいポイント
リダイレクトの際のredirect()->with()
のwith
はセッションのフラッシュメッセージを保存するメソッドになっています。しかし、ビューを返す際のview()->with()
のwith
は前提知識でも書いたように、変数をセットするメソッドです。なので、ビューを返す場合の処理は2行になっています。逆にリダイレクトの場合でもwith
を使わずに下のように書くことも可能です。
publicfunctionredirect(){Session::flash('message','Hello!');returnredirect()->route('home');}
最後に
ビューを返すときはフラッシュメッセージの内容を変数に入れて表示すれば良いのでは?という方もいそうですが、テンプレートでフラッシュメッセージ表示部分を共通化しているので、ビューを返す時にもセッションを使いたいという気持ちになり、記事を書きました。
参考記事
https://stackoverflow.com/questions/42417865/how-to-return-view-with-flash-message