HTTP セッション
はじめに
HTTP ドライブ型のアプリケーションは状態を持たないため、セッションはユーザーに関する情報を複数のリクエスト間で保存する方法を提供します。そのユーザー情報は通常、後続のリクエストからアクセスできる永続ストア / バックエンドに配置されます。
Laravel には、表現豊かで統一された API を介してアクセスされるさまざまなセッションバックエンドが付属しています。Memcached、Redis、データベースなどの人気のあるバックエンドをサポートしています。
構成
アプリケーションのセッション構成ファイルは config/session.php
に保存されています。このファイルで利用可能なオプションを確認してください。デフォルトでは、Laravel は database
セッションドライバーを使用するように構成されています。
セッションの driver
構成オプションは、各リクエストのセッションデータが保存される場所を定義します。Laravel にはさまざまなドライバーが含まれています:
file
- セッションはstorage/framework/sessions
に保存されます。cookie
- セッションは安全な暗号化されたクッキーに保存されます。database
- セッションはリレーショナルデータベースに保存されます。memcached
/redis
- セッションはこれらの高速なキャッシュベースのストアのいずれかに保存されます。dynamodb
- セッションは AWS DynamoDB に保存されます。array
- セッションは PHP 配列に保存され、永続化されません。
配列ドライバーは主に テスト 中に使用され、セッションに保存されたデータが永続化されないようにします。
ドライバーの前提条件
データベース
database
セッションドライバーを使用する場合、セッションデータを格納するためのデータベーステーブルが必要です。通常、これは Laravel のデフォルトの 0001_01_01_000000_create_users_table.php
データベースマイグレーション に含まれています。ただし、何らかの理由で sessions
テーブルが存在しない場合は、次のマイグレーションを生成するために make:session-table
Artisan コマンドを使用できます:
php artisan make:session-table
php artisan migrate
Redis
Laravel で Redis セッションを使用する前に、PECL を介して PhpRedis PHP 拡張機能をインストールするか、Composer を介して predis/predis
パッケージ (~1.0) をインストールする必要があります。Redis の設定に関する詳細は、Laravel の Redis ドキュメント を参照してください。
SESSION_CONNECTION
環境変数、または session.php
構成ファイルの connection
オプションを使用して、セッションストレージに使用する Redis 接続を指定できます。
セッションとのやり取り
データの取得
Laravel でセッションデータを操作する主な方法は、グローバルの session
ヘルパーと Request
インスタンスを介した方法の2つです。まず、Request
インスタンスを介してセッションにアクセスする方法を見てみましょう。これは、ルートクロージャやコントローラーメソッドで型ヒントとして使用できます。コントローラーメソッドの依存関係は、Laravel の サービスコンテナ を介して自動的にインジェクションされます:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\View\View;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*/
public function show(Request $request, string $id): View
{
$value = $request->session()->get('key');
// ...
$user = $this->users->find($id);
return view('user.profile', ['user' => $user]);
}
}
セッションからアイテムを取得するときに、get
メソッドの第2引数としてデフォルト値を渡すこともできます。指定したキーがセッションに存在しない場合、このデフォルト値が返されます。get
メソッドにデフォルト値としてクロージャを渡し、リクエストされたキーが存在しない場合は、そのクロージャが実行され、その結果が返されます:
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function () {
return 'default';
});
グローバルセッションヘルパー
あなたはグローバル session
PHP 関数を使用して、セッション内のデータを取得および保存することもできます。session
ヘルパーが単一の文字列引数で呼び出されると、そのセッションキーの値が返されます。配列のキー/値のペアでヘルパーが呼び出されると、それらの値がセッションに保存されます:
Route::get('/home', function () {
// Retrieve a piece of data from the session...
$value = session('key');
// Specifying a default value...
$value = session('key', 'default');
// Store a piece of data in the session...
session(['key' => 'value']);
});
HTTP リクエストインスタンスを介してセッションを使用する場合と、グローバル session
ヘルパーを使用する場合との間には、実質的な違いはほとんどありません。両方の方法は、すべてのテストケースで利用可能な assertSessionHas
メソッドを介して テスト可能 です。