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