【Laravel入門】PHPのsessionについて
今回はPHPのsessionについてです。
sessionとは
セッションとは、ユーザーがウェブサイトを訪れてから離れるまでの一連のアクションを追跡・管理するための仕組みです。
具体的には、セッションはユーザーごとに一意のIDを割り当て、このIDを使ってユーザーの状態やデータをサーバー側で保持します。
sessionのドライバー
ドライバーとは?
Laravelのセッションドライバーは、セッションデータを保存する場所や方法を決定する設定です。Laravelは様々なドライバーをサポートしており、アプリケーションの要件に応じて適切なドライバーを選択することができます。
各ドライバーは次のようになっています。
file
: サーバーのファイルシステムに保存されます。デフォルトはstorage/framework/sessions
です。cookie
: セッションデータが暗号化されてクライアントのクッキーに保存されます。database
: セッションデータがデータベースに保存されます。memcached
/redis
: セッションデータがメモリ内データストアに保存されます。dynamodb
: AWSのDynamoDBに保存されます。array
: リクエスト間でセッションデータは保持されません(テスト目的)。
sessionの有効期限
セッションの有効期限はconfig/session.php
のlifetime
設定で指定されます。
単位は分で行います。
'lifetime' => env('SESSION_LIFETIME', 10),
'expire_on_close' => false,
lifetime
は、セッションが有効である期間を分単位で設定するためのオプションです。以下は、config/session.php
におけるlifetime
の設定部分のコードです。
このコードは、セッションの有効期限をデフォルトで10分に設定し、ブラウザを閉じてもセッションが終了しないように設定しています。
sessionのドメインとパス
セッションクッキーのドメイン範囲はconfig/session.php
のdomain
設定で、パス範囲はpath
設定で指定できます。
// config/session.php
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => env('SESSION_LIFETIME', 10),
'domain' => env('SESSION_DOMAIN', null),
'path' => '/',
上記の設定ではファイルシステムにセッションが保存され、クッキーの有効期限は10分です。
config/session.php
Laravelのデフォルトのconfig/session.php
ファイルの一部です。
必要に応じて環境変数(.env
ファイル)で設定を変更してください。
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "dynamodb", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => env('SESSION_LIFETIME', 10),
'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
| Session Encryption
|--------------------------------------------------------------------------
|
| This option allows you to easily specify that all of your session data
| should be encrypted before it is stored. All encryption will be run
| automatically by Laravel and you can use the session like normal.
|
*/
'encrypt' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path('framework/sessions'),
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => env('SESSION_CONNECTION', null),
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Cache Store
|--------------------------------------------------------------------------
|
| When using the "apc", "memcached", or "dynamodb" session drivers you may
| list a cache store that should be used for these sessions. This value
| must correspond with one of the application's configured cache stores.
|
*/
'store' => env('SESSION_STORE', null),
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => [2, 100],
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => env('SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'),
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => env('SESSION_DOMAIN', null),
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => env('SESSION_SECURE_COOKIE', null),
/*
|--------------------------------------------------------------------------
| HTTP Access Only
|--------------------------------------------------------------------------
|
| Setting this value to true will prevent JavaScript from accessing the
| value of the cookie and the cookie will only be accessible through
| the HTTP protocol. You are free to modify this option if needed.
|
*/
'http_only' => true,
/*
|--------------------------------------------------------------------------
| Same-Site Cookies
|--------------------------------------------------------------------------
|
| This option determines how your cookies behave when cross-site requests
| take place, and can be used to mitigate CSRF attacks. By default, we
| will set this value to "lax" since this is a secure default value.
|
| Supported: "lax", "strict", "none"
|
*/
'same_site' => 'lax',
];
保存
単一保存
セッションヘルパー関数を使ってセッションにデータを保存するための方法です。
この保存は次のリクエスト以降でも有効です。
putと同様に動きます
session(['key' => 'value']);
ファザード(Facade)を使ってsessionを保存します。
put
メソッドは、セッションにデータを保存し、そのデータは次のリクエスト以降も有効です。
データは明示的に削除されるか、セッションが期限切れになるまでセッション内に保持されます。
use Illuminate\Support\Facades\Session;
Session::put('key', 'value');
flash
メソッドは、セッションに一時的なデータを保存します。
このデータは次のリクエストでのみ有効で、その後のリクエストでは自動的に削除されます。
これにより、ユーザーに一時的なメッセージや通知を表示するのに便利です。
session()->flash('key', 'value');
複数保存
配列にkeyをvalueを指定してセッションに保存できます。
session(['key1' => 'value1', 'key2' => 'value2']);
フラッシュデータを複数セッションに保存する場合はkeyを複数指定することで保存できます。
session()->flash('name', 'Kami');
session()->flash('gender', 'Man');
ファザードを使って配列にkeyを指定することで、まとめてフラッシュデータを保存することができます。
Suse Illuminate\Support\Facades\Session;
Session::flash('user_data', [
'name' => 'Kami',
'gender' => 'Man'
]);
putを使って、配列にkeyとvalueを指定してセッションに保存できます。
use Illuminate\Support\Facades\Session;
Session::put(['key1' => 'value1', 'key2' => 'value2']);
スポンサードサーチ
取得
単一取得
ヘルパー関数を使用してsessionを取得します。
$value = session('key');
ファザードを使用してsessonを取得
use Illuminate\Support\Facades\Session;
$value = Session::get('key');
デフォルト値を設定して取得
ヘルパー関数を使用を使用して、デフォルト値を設定して単一のセッションデータを取得します。
sessionのデフォルト値について説明します。
指定されたキーに対応するセッションデータが存在しない場合に、デフォルト値を返します。
$value = session('key', 'default');
複数取得
ヘルパー関数を使用して複数のセッションデータを取得意します。
$values = session()->only(['key1', 'key2']);
ファザードを使って、複数のsessionを取得します。
use Illuminate\Support\Facades\Session;
$values = Session::only(['key1', 'key2']);
デフォルト値を設定して複数取得
ヘルパー関数を使用してデフォルト値を設定して単一のセッションデータを取得します。
session('key', 'default');
ファサードを使用してデフォルト値を設定して単一のセッションデータを取得します。
use Illuminate\Support\Facades\Session;
$value = Session::get('key', 'default');
削除
単一削除
ヘルパー関数の削除の場合はkeyをセットしてsessionを削除します。
session()->forget('key');
こちらも同様に、ファザードを使ってkeyをセットしてsessionを削除します。
use Illuminate\Support\Facades\Session;
Session::forget('key');
複数削除
複数のセッションデータを削除の場合はforgetに配列してで削除できます。
session()->forget(['key1', 'key2']);
こちらも同様に削除できます。
各一つずつ指定して複数削除することもできます。
session()->forget('key1');
session()->forget('key2');
session()->forget('user_data');
ファザードを使って各keyを指定して削除することもでき、配列のkeyでの削除もできます。
use Illuminate\Support\Facades\Session;
Session::forget(['key1', 'key2', 'user_data']);
全データ削除
keyを指定しない場合は全てのsessionが削除されます。
session()->flush();
こちらも同様に削除できます。
use Illuminate\Support\Facades\Session;
Session::flush();
スポンサードサーチ
セッションヘルパーを使った例
セッションにデータを保存する
class HogeController extends Controller
{
public function saveData()
{
// セッションにデータを保存
session(['key' => 'value']);
return redirect('show-data');
}
}
セッションからデータを取得する
class HogeController extends Controller
{
public function showData()
{
// セッションからデータを取得
$value = session('key');
return view('hoge.view', ['key' => $value]);
}
}
セッションからデフォルト値を設定してデータを取得する
class HogeController extends Controller
{
public function showDataWithDefault()
{
// セッションからデータを取得、キーが存在しない場合はデフォルト値を返す
$value = session('key', 'default_value');
return view('hoge.view', ['key' => $value]);
}
}
セッションから複数のデータを取得する
class HogeController extends Controller
{
public function showMultipleData()
{
// セッションから複数のデータを取得
$values = session()->only(['key1', 'key2']);
return view('hoge.view', $values);
}
}
セッションのデータを削除する
class HogeController extends Controller
{
public function deleteData()
{
// セッションのデータを削除
session()->forget('key');
return redirect('show-data');
}
}
セッションの全データを削除する
class HogeController extends Controller
{
public function deleteAllData()
{
// セッションの全データを削除
session()->flush();
return redirect('show-data');
}
}
フラッシュデータをセッションに保存する
class HogeController extends Controller
{
public function flashData()
{
// フラッシュデータをセッションに保存
session()->flash('status', 'Data was saved successfully!');
return redirect('show-data');
}
}
ビューでフラッシュデータを表示する
<!DOCTYPE html>
<html>
<head>
<title>Flash Example</title>
</head>
<body>
@if (session('status'))
<p>Status: {{ session('status') }}</p>
@endif
</body>
</html>
コントローラ全体の例
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HogeController extends Controller
{
public function saveData()
{
// セッションにデータを保存
session(['key' => 'value']);
return redirect('show-data');
}
public function showData()
{
// セッションからデータを取得
$value = session('key');
return view('hoge.view', ['key' => $value]);
}
public function showDataWithDefault()
{
// セッションからデータを取得、キーが存在しない場合はデフォルト値を返す
$value = session('key', 'default_value');
return view('hoge.view', ['key' => $value]);
}
public function showMultipleData()
{
// セッションから複数のデータを取得
$values = session()->only(['key1', 'key2']);
return view('hoge.view', $values);
}
public function deleteData()
{
// セッションのデータを削除
session()->forget('key');
return redirect('show-data');
}
public function deleteAllData()
{
// セッションの全データを削除
session()->flush();
return redirect('show-data');
}
public function flashData()
{
// フラッシュデータをセッションに保存
session()->flash('status', 'Data was saved successfully!');
return redirect('show-data');
}
}
ビューの例
<!DOCTYPE html>
<html>
<head>
<title>Session Example</title>
</head>
<body>
<p>Session Value: {{ $key }}</p>
@if (session('status'))
<p>Status: {{ session('status') }}</p>
@endif
<p>Multiple Session Values:</p>
<ul>
@isset($key1)
<li>Key1: {{ $key1 }}</li>
@endisset
@isset($key2)
<li>Key2: {{ $key2 }}</li>
@endisset
</ul>
</body>
</html>
スポンサードサーチ
実装やエラーが解決できない場合
プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。
考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。
そういう時は聞ける先輩や、メンターに相談することが大事です。
僕にも相談可能なので気軽に相談してください。
Twitterからの連絡だと確実ですよ。
オンラインスクールやプログラミングスクールといったプログラミングを学べる方法もあるので、そちらもぜひ活用してもいいと思います。
Web開発で分からない時
オンライン完結型スクール DMM WEBCAMP PROアプリ開発で分からない時
プログラミング×稼げる副業スキルはテックキャンププログラミングについて分からない時
【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。僕への個人でもメンターでも、スクールでもお好きな方を活用ください。