Laravel - 22. セッション - データの保存
Laravelのセッションデータはデフォルトでサーバ上のファイルに保存されるようになっています。このようなセッションデータの管理方法はLaravelの設定ファイルを編集することでカスタマイズできます。セッションデータの保存先には以下のような方法があります。
- file - storage/framework/sessions にファイルとして保存する
- cookie - 暗号化されたCookieに保存する
- database - データベースに保存する
- memcached / redis - 高速なキャッシュベースストアに保存する
- array - PHPの配列として保存する(永続化しない)
ここではセッションデータの保存先にデータベースを利用する方法を取り上げます。データベースにセッションデータを保存する場合は、以下の手順で設定を行います。
- マイグレーションファイル(
sessions
テーブル)の作成 - マイグレーションの実行
.env
ファイルの編集
マイグレーションファイル( sessions
テーブル)の作成
データベースにセッションデータを保存するために sessions
テーブルを作成する必要があります。これには専用のコマンド( php artisan session:table
)でマイグレーションファイルを作成します。
$ php artisan session:table
Migration created successfully!
コマンドが成功すると database/migrations/2020_09_07_072116_create_sessions_table.php
ファイルが生成されます。テキストエディタで開いてみましょう。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSessionsTable extends Migration
{
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');
});
}
public function down()
{
Schema::dropIfExists('sessions');
}
}
マイグレーションファイルにはデフォルトで sessions
テーブルの定義が実装されているので編集は不要です。
マイグレーションの実行
続いてマイグレーションを実行します。
$ php artisan migrate
Migrating: 2020_09_07_072116_create_sessions_table
Migrated: 2020_09_07_072116_create_sessions_table (0.1 seconds)
マイグレーションコマンドが成功するとデータベースに sessions
テーブルが生成されます。PostgreSQLのクライアントツールから生成されたテーブルを確認してみましょう。
laravel=# \d sessions;
Table "public.sessions"
Column | Type | Collation | Nullable | Default
---------------+------------------------+-----------+----------+---------
id | character varying(255) | | not null |
user_id | bigint | | |
ip_address | character varying(45) | | |
user_agent | text | | |
payload | text | | not null |
last_activity | integer | | not null |
Indexes:
"sessions_id_unique" UNIQUE CONSTRAINT, btree (id)
.env
ファイルの編集
最後にセッションデータの管理方法を編集するために .env
ファイルを編集します。ここでは .env
ファイルを編集する前に config/session.php
ファイルをテキストエディタで開いてみましょう。
<?php
use Illuminate\Support\Str;
return [
'driver' => env('SESSION_DRIVER', 'file'),
# 省略
そうすると上記のような env
関数によって環境変数 SESSION_DRIVER
を参照しているプログラムがあります。このプログラムによってセッションデータの管理方法が決定しています。ここではプログラムを直接編集するのではなく .env
ファイルを開いて SESSION_DRIVER
変数の値を変更するようにします。
# 省略
SESSION_DRIVER=database
# 省略
以上でセッションデータの管理方法をデータベースに変更できます。
動作確認
それではセッションの管理方法を修正したので、PHPのビルトインWebサーバを使ってWebアプリケーションを起動してみましょう。次のようにコマンドを入力します。
$ php artisan serve --host 0.0.0.0
Laravel development server started: http://0.0.0.0:8000
セッションデータの保存先の変更を確認するにはビルトインWebサーバを再起動する必要があります。
続いてブラウザを起動してWebアプリケーションにアクセスしてみましょう。
http://localhost:8000/hello
画面には以前のようにセッションに格納している count
キーの値が表示されてます。
また実際に sessions
テーブルにレコードが登録されていることも確認しておきましょう。
laravel=# select count(*) from sessions;
count
-------
1
(1 row)
実行結果から1件のレコードが生成されていることがわかります。Webアプリケーションに別のクライアントがアクセスしてきた場合は新たに1件のレコードが追加されることになります。
まとめ
- Laravelはセッションに格納したデータの保存先を変更できる
- デフォルトでは
storage/framework/sessions
フォルダ下に保存されている - セッションの構成は
config/session.php
でカスタマイズできる