Laravelにおけるセッション(session)機能を試してみます。
セッション自体をはじめて理解したいという方向け
まず .envファイルのSESSION_DRIVERを確認します。バージョン6.xでは、セッションデータの保存先としてcookieがデフォルトとなっています。
1 |
SESSION_DRIVER=cookie |
他にもfile、database、memcached、redis、arrayを設定することができます。本記事ではデフォルトのcookieとdatabaseを扱ってみます。
下記イラストのようなセッション機能による簡単な挙動を作成してみます。なお必要最低限の処理のみでフォーム未入力チェックなどは実装していませんのであしからず。
適当なコントローラーを作成します。
1 |
$ php artisan make:controller SessionController |
web.phpに下記コードを追記します。
routes/web.php
1 2 3 |
Route::get('session', 'SessionController@index'); Route::post('session', 'SessionController@store'); Route::get('session/delete', 'SessionController@delete'); |
生成されたコントローラーにindex()・store()・delete()の3つのメソッドを追記します。
app/Http/Controllers/SessionController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SessionController extends Controller { public function index() { return view('session.index'); } public function store(Request $request) { $request->session()->put('name', $request->input('name')); $request->session()->flash('message', 'セッションにデータを保存しました!'); return redirect('session'); } public function delete(Request $request) { $request->session()->forget('name'); return view('session.delete'); } } |
16行目
フォームから受け取ったデータを、「name」という名前のキー(key)に対する値(value)としてセッションに保存しています。保存した値は「name」をキーとして再び取り出すことができます。
17行目
flashメソッドを利用して「現在と直後のHTTPリクエストの間だけ」(参照ページから抜粋)有効となるデータ(フラッシュデータ)を保存しています。リダイレクト先のページでリロードするとこのmessageキーに紐付けられたセッションのデータは削除されます。※なお本記事ではリロードせずに自動で消えるようにしています。
24行目
nameキーに紐付けられたセッションのデータを破棄しています。
以下フォーム画面とセッションのデータ削除完了画面としてのテンプレートを用意します。
resources/views/session/index.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <style> #sample { height: 50px; width: 300px; background: green; } </style> <script> $(document).ready(function() { $('#sample').fadeOut(5000); }); </script> @if (Session::has('message')) <div id="sample"> <p>{{ Session::get('message') }}</p> </div> @endif @if (Session::has('name')) <p>{{ Session::get('name') }}</p> <p><a href="session/delete">破棄する</a></p> @else <p>セッションデータはありません。</p> @endif <form action="session" method="POST"> @csrf <p>名前:<input type="text" name="name"></p> <input type="submit" value="ボタン"> </form> |
15〜19行目
コントローラー側で説明したflashメソッドによるフラッシュデータを表示させています。ページ自体をリロードするとこのデータは破棄されますが、今回はjQueryを利用してフェードアウトさせています。
関連記事
21〜26行目
nameキーに対応したセッションのデータを判定し表示させています。
resources/views/session/delete.blade.php
1 2 3 |
<p>セッションのデータを破棄しました。</p> <p><a href="/session">はじめに戻る</a></p> |
データベースを利用する
すでにMySQL等のデータベースに接続していることを前提に話を進めます。
まず .envファイルのSESSION_DRIVERにdatabaseに設定します。
1 |
SESSION_DRIVER=database |
.envを編集した場合は、キャッシュをクリアにするため下記コマンドを実行します。
1 |
$ php artisan config:cache |
次にセッション用のテーブルを生成するマイグレーションファイルを作成します。
1 |
$ php artisan session:table |
マイグレーションファイルが生成されているのが確認できます。
database/migrations/2020_02_03_125312_create_sessions_table.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateSessionsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('sessions', function (Blueprint $table) { $table->string('id')->unique(); $table->unsignedBigInteger('user_id')->nullable(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); $table->integer('last_activity'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('sessions'); } } |
マイグレーションを実行します。
1 |
$ php artisan migrate |
sessionsテーブルが生成されたのが確認できます。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> DESCRIBE sessions; +---------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------------+------+-----+---------+-------+ | id | varchar(255) | NO | PRI | NULL | | | user_id | bigint(20) unsigned | YES | | NULL | | | ip_address | varchar(45) | YES | | NULL | | | user_agent | text | YES | | NULL | | | payload | text | NO | | NULL | | | last_activity | int(11) | NO | | NULL | | +---------------+---------------------+------+-----+---------+-------+ |
再度セッションにデータを保存するとテーブルにデータが登録されているのが確認できます。
1 2 3 4 5 6 7 8 9 |
mysql> SELECT * FROM sessions\G *************************** 1. row *************************** id: WfbYyJsoHFvA8RxKBWXcADIlSJpIVpY5YDZc7mqA user_id: NULL ip_address: 127.0.0.1 user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit〜 payload: YTo0OntzOjY6Il90b2tlbiI7czo0MDoiN1hjN1dhU〜 last_activity: 1580738971 1 row in set (0.00 sec) |
※一部省略してます。
参照ページ