Laravel - 21. セッション - フラッシュデータ

引き続きセッションの使い方について学習していきましょう。Laravelのセッションを使ってフラッシュデータを作成できます。フラッシュデータとはリダイレクト先で参照可能なセッションデータです。フラッシュデータではリダイレクト後に自動でセッションから削除されるようになっています。フラッシュデータではデータの登録処理や更新処理、削除処理のようなリダイレクトを伴うケースで、画面にメッセージを出力する際に利用できます。

ここでは app/Http/Controllers/HelloController.phpstore アクションを修正して、フラッシュデータを使って登録完了メッセージを表示してみます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Message;
use App\Http\Requests\MessageRequest;

class HelloController extends Controller
{
    public function index(Request $request)
    {
        $count = $request->session()->get("count", 0);
        $count++;
        $request->session()->put("count", $count);

        $title = "Hello Model!";
        $messages = Message::orderBy("id")->get();
        return view("hello/index", compact("title", "messages"));
    }

    public function create()
    {
        return view("hello/create");
    }

    public function store(MessageRequest $request)
    {
        $text = $request->input("text");

        $message = new Message();
        $message->text = $text;
        $message->save();

        $request->session()->flash("message", "Added message.");

        return redirect("/hello");
    }
}

store アクションでは Message モデルを使って新規レコードを登録したあと、セッションにフラッシュデータを保存しています。セッションにフラッシュデータを保存するには flash メソッドを使います。

        $request->session()->flash("message", "Added message.");

flash メソッドは通常の put メソッドと同様に第1引数にキー、第2引数に保存する値を指定します。フラッシュデータとして保存されたデータはリダイレクト先の処理の中から参照できます。ここでは index アクションにリダイレクトしているので、 index アクションから呼び出されるビューファイル( resources/views/hello/index.blade.php )の中でフラッシュメッセージを表示します。

@extends('layout.app')

@section('content')
<h1>{{ $title }}</h1>
@if (Session::has("message"))
  <p>{{ session("message") }}</p>
@endif
<ul>
  @foreach ($messages as $message)
    @if (mb_strlen($message->text) >= 5)
      <li>{{ $message->text }}</li>
    @endif
  @endforeach
</ul>
<hr>
<p>Count: {{ session("count") }}</p>
@endsection

上記のビューにおいては、先頭部分で @if ディレクティブと Session ファサードを使ってセッションに "message" キーが存在するか確認しています。セッションに "message" キーが存在する場合は session 関数を使って "message" キーの値を出力しています。

フラッシュデータとして保存した値は自動的に削除されます。

動作確認

それでは HelloControllerstore アクションとビューファイル( resources/views/hello/index.blade.php )を修正したので、PHPのビルトインWebサーバを使ってWebアプリケーションを起動してみましょう。次のようにコマンドを入力します。

$ php artisan serve --host 0.0.0.0
Laravel development server started: http://0.0.0.0:8000

続いてブラウザを起動してWebアプリケーションにアクセスしてみましょう。

http://localhost:8000/hello/create

入力フォームが表示されるので、メッセージに Konnichiwa と入力して送信ボタンをクリックします。

index アクションにリダイレクトされ、登録完了メッセージ( Addedd message. )が表示されます。続いてブラウザのリロードボタンを押してみましょう。

さきほどの登録完了メッセージが非表示となります。このようにフラッシュデータはリダイレクト先でのみ参照可能なセッションデータとして利用できます。

まとめ

  • フラッシュデータとはリダイレクト時など、次のリクエストのためにセッションにデータを保存する仕組み
  • アクションメソッドにおいては $request->session()->flash メソッドを使ってフラッシュデータを保存できる
  • フラッシュデータは次のリクエストの間のみ使用可能であり自動的に削除される