Laravel - 20. セッション

ここからはセッションの取り扱い方法について学習します。通常のPHPの開発においては session_start 関数や $_SESSION 変数を通じてセッションにアクセスします。Laravelではセッションの操作方法も Request インスタンスの session メソッドや Session ファサードなどを使って操作できるようになっています。

ここでは app/Http/Controllers/HelloController.phpindex アクションを修正してセッションの挙動を確認してみることにします。

<?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();

        return redirect("/hello");
    }
}

アクションメソッドにおいて、セッションにアクセスするには $request->session() メソッドを呼び出します。$request->session() メソッドは戻り値にセッションデータの保存先を示す Store インスタンスを返すので、 Store インスタンスの get メソッドを使ってセッションからキーを指定してデータを取得したり、 put メソッドを使ってセッションにキーとデータを保存したりします。

index アクションにおいては $request->session()->get("count", 0); と呼び出すことでセッションから "count" というキーでデータを取得しています。この get メソッドは第1引数にキーを受け取り、第2引数でデータの初期値を指定します。 get("count", 0) と引数を指定することで、セッションに "count" キーが存在しない場合は、初期値として 0 が返却されるようになります。

また $count 変数の値をインクリメントした後、 $request->session()->put("count", $count); と呼び出すことでセッションに "count" というキーで $count 変数の値を保存しています。

続いて index アクションの表示先となるビューファイル( resources/views/hello/index.blade.php )を編集します。

@extends('layout.app')

@section('content')
<h1>{{ $title }}</h1>  
<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

ここでは session 関数を使って "count" キーの値を取得しています。

<p>Count: {{ session("count") }}</p>

このようにBladeのビューファイルにおいても簡単にセッションにアクセスできます。

動作確認

それでは HelloControllerindex アクションとビューファイル( 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

画面の下部に Count: 1 が出力されているのがわかります。この状態でブラウザのリロードボタンをクリックしてみましょう。

そうすると再び HelloControllerindex アクションが呼び出されるのでセッションに保存している "count" キーの値がインクリメントされます。

まとめ

  • セッションを操作するクラスやメソッドも用意されている
  • アクションメソッドにおいては $request->session() とすることでセッションにアクセスできる
  • ビューにおいては session 関数や Session ファサードによってセッションにアクセスできる