セッション
- ドライバーの前提条件
- データベース
- Redis
- セッションの使用
- #セッションが存在するかどうかを判断する特定の値
HTTP セッション メカニズム
- 概要
- #セッションの使用
- ##データの取得
- ##データの保存
- #フラッシュ データ
- データの削除
- セッション ID の再生成
- カスタム セッション ドライバーの追加
- ##ドライバーの実装 #はじめに
HTTP 駆動型アプリケーションはステートレスであるため、Session は次の情報を保存する方法を提供します。ユーザーが複数のリクエストにまたがる場合、Laravel は同じ読み取り可能な API を通じてさまざまな組み込みバックエンドドライバーを処理します。 Memcached、Redis などの一般的なデータベースをサポートします。
構成Session の構成ファイルはconfig/session.php ファイルに保存されます。このファイルで使用できるオプションを必ず確認してください。デフォルトでは、Laravel はほとんどのアプリケーションのセッションドライバーを file
として設定します。実稼働環境では、セッションのパフォーマンスをさらに向上させるために、memcachedまたはredis
ドライバーの使用を検討できます。
-Session
driverの構成により、リクエストごとにセッション データが保存される場所が事前に設定されます。 Laravel には、すぐに使える優れたドライバーがいくつか付属しています:
file
storage/framework/sessions
の中央にセッションを保存します。
cookie- - セッションは安全な暗号化された Cookie に保存されます。
database
- セッションはリレーショナル データベースに保存されます。
- memcached
/
redis - セッションはキャッシュベースのストレージ システムに保存されます。 array
- セッションは PHP 配列に保存されますが、永続化されません。 {ヒント} アレイ ドライバーは通常、テストと、セッションに保存されたデータが永続化されるのを防ぐために使用されます。
#ドライバーの前提条件
databaseをセッション ドライバーとして使用するには、さまざまなセッション データを含むテーブルを作成する必要があります。以下は、Schemaを使用してテーブルを作成する例です:
Schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->unsignedInteger('user_id')->nullable(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); $table->integer('last_activity'); });
Artisan コマンドsession:tableを使用して、この移行を生成できます:
php artisan session:table php artisan migrate
#
Redis
Redis を Laravel のセッション ドライバーとして使用する前に、Composer を通じて
#セッションの使用predis/predis
拡張パッケージ (~1.0) をインストールする必要があります。次に、database
構成ファイルで Redis 接続情報を構成します。session
構成ファイルでは、connection
オプションを使用して、セッションが使用する Redis 接続を指定できます。## 取得dataLaravel でセッション データを処理するには、主に 2 つの方法があります。グローバル ヘルパー関数
sessionと
getRequest
インスタンスを使用する方法です。まず、Request
インスタンスのコントローラー メソッド タイプ ヒントを介してセッションにアクセスする方法を見てみましょう。コントローラーメソッドの依存関係は、Laravel サービスコンテナーを通じて自動的に挿入されます。
セッションから値を取得するとき、<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 展示给定用户的配置文件。 * * @param Request $request * @param int $id * @return Response */ public function show(Request $request, $id) { $value = $request->session()->get('key'); // } }
メソッドの 2 番目のパラメーターとしてデフォルト値を渡すこともできます。 。指定されたキーがセッションに存在しない場合は、このデフォルト値が返されます。クロージャがデフォルト値として
##グローバル補助関数 Sessionグローバル PHP 補助関数get
メソッドに渡され、要求されたキーが存在しない場合、get
メソッドはクロージャを実行し、その結果を返します:$value = $request->session()->get('key', 'default'); $value = $request->session()->get('key', function () { return 'default'; });
session
を使用して、セッション データを取得および保存することもできます。単一の文字列値をパラメータとしてヘルパー関数session
を呼び出すと、その文字列に対応するセッション キーの値が返されます。キーと値のペアの配列をパラメータとしてヘルパー関数
sessionを呼び出すと、受信したキー値はセッションに保存されます:
Route::get('home', function () { // 获取 session 中的一条数据... $value = session('key'); // 指定一个默认值... $value = session('key', 'default'); // 在 Session 中存储一条数据... session(['key' => 'value']); });
{tip} リクエストHTTP 経由のインスタンス Session の操作とグローバル ヘルパー関数 session
の使用には大きな違いはありません。どちらのメソッドも、すべてのテスト ケースで使用できる
すべてのセッション データを取得するすべてのセッション データを取得したい場合は、assertSessionHas
メソッドを介してテストできます。
all
メソッドを使用できます:$data = $request->session()->all();
セッションに特定の値が存在するかどうかを確認するセッションに特定の値が存在するかどうかを確認するには、
has
メソッドを使用します。値が存在し、null
ではない場合、
hasメソッドは
true:
if ($request->session()->has('users')) { // }
を返します。 Session では、値が
null であってもexists
メソッドを使用できます。
existsメソッドは、値が存在する場合に
trueを返します:
if ($request->session()->exists('users')) { // }
データの保存
セッションにデータを保存するには、
put
メソッドを使用するか、補助関数session
を使用します。// 通过请求实例... $request->session()->put('key', 'value'); // 通过全局辅助函数... session(['key' => 'value']);
Save data in Session array
push
メソッドは、Session 配列に新しい値を追加できます。たとえば、キーuser.teams
がチーム名を含む配列であると仮定すると、次のように配列に新しい値を追加できます:$request->session()->push('user.teams', 'developers');
取得と削除データ
pull
メソッドは、1 つのステートメントのみを使用してセッションからステートメントを取得および削除できます:$value = $request->session()->pull('key', 'default');
フラッシュ データ
#次のリクエストに備えてセッションにデータを保存したい場合は、
flash
メソッドを使用できます。このメソッドを使用してセッションに保存されたデータは、次の HTTP リクエストが到着するまでのみ保持され、その後削除されます。フラッシュ データは主に短期ステータス メッセージに使用されます:$request->session()->flash('status', 'Task was successful!');
この 1 回限りのデータをさらに多くのリクエストで使用する必要がある場合は、
reflash
メソッドを使用すると、すべてのリクエストを保存できます。 1 回限りのリクエストは、次のリクエストまで保持されます。 1 回限りのデータを保存したい場合は、keep
メソッドを使用できます:$request->session()->reflash(); $request->session()->keep(['username', 'email']);
データの削除
forget
メソッドは、指定されたデータをセッションから削除します。セッションからすべてのデータを削除したい場合は、flush
メソッドを使用できます:$request->session()->forget('key'); $request->session()->flush();
セッション ID の再生成
セッション ID の再生成は、通常、悪意のあるユーザーがセッション固定を使用してアプリケーションを攻撃するのを防ぐために行われます。
組み込み関数
LoginController
を使用すると、Laravel は認証時にセッション ID を自動的に再生成します。それ以外の場合は、regenerate
メソッドを使用してセッション ID を手動で再生成する必要があります。$request->session()->regenerate();
カスタム セッション ドライバーの追加
ドライバーの実装
カスタム セッション ドライバーは、
SessionHandlerInterface
インターフェイスを実装する必要があります。このインターフェイスには、実装する必要があるいくつかの単純なメソッドが含まれています。以下は MongoDB 実装の一般的なプロセスの例です:<?php namespace App\Extensions; class MongoSessionHandler implements \SessionHandlerInterface{ public function open($savePath, $sessionName) {} public function close() {} public function read($sessionId) {} public function write($sessionId, $data) {} public function destroy($sessionId) {} public function gc($lifetime) {} }
{tip} Laravel にはデフォルトでパッケージ拡張用のディレクトリが付属していませんが、任意のディレクトリに配置できます。上の例では、
MongoSessionHandler
を保存するためのExtensions
ディレクトリを作成しました。上記のメソッドは理解しにくいため、各メソッドを簡単に説明します。
#ドライバーの登録ドライバーを実装した後、ドライバーを次の場所に登録する必要があります。枠組み。open
メソッド 通常はファイル用-ベースのセッションストレージシステム。なぜなら、Laravel にはすでにfile
セッションドライバーが付属しているからです。したがって、このメソッドにコードを記述する必要はありません。 PHP では、このメソッドの実装が必要です (これは単なる悪いインターフェイス設計です)。このメソッドを空のままにする必要があります。close
メソッドはopen
メソッドに似ており、通常は無視できます。ほとんどのドライバーでは、この方法は必要ありません。read
メソッドは、指定された$sessionId
に一致するセッション データの文字列形式を返す必要があります。 Laravel が自動的にシリアル化を実行するため、カスタムドライバーでセッションデータを取得または保存するときに、シリアル化やその他のコーディングを行う必要はありません。write
メソッドは、$sessionId
に関連付けられた指定された$data
文字列を、 MongoDB や Dynamo などの永続ストレージ システムに書き込みます。繰り返しますが、Laravel が自動的にこれを処理するため、シリアル化やその他のコーディングを行う必要はありません。destroy
メソッドは、$sessionId
に関連するデータを永続ストレージから削除します。gc
メソッドは、指定された$lifetime
(UNIX タイムスタンプ) より前のすべてのデータを破棄します。 Memcached や Redis など、独自の有効期限メカニズムを持つシステムの場合、このメソッドは空白のままにすることができます。
Laravel
バックエンドにドライバーを追加するには、
Sessionファサードの
extendメソッドを使用する必要があります。サービスプロバイダーの
bootメソッドで
extendメソッドを呼び出す必要があります。既存の
AppServiceProviderに対してこの操作を実行することも、別のサービス プロバイダーを作成することもできます:
<?php namespace App\Providers; use App\Extensions\MongoSessionHandler; use Illuminate\Support\Facades\Session; use Illuminate\Support\ServiceProvider; class SessionServiceProvider extends ServiceProvider{ /** * 执行服务的注册后启动 * * @return void */ public function boot() { Session::extend('mongo', function ($app) { // 返回实现 SessionHandlerInterface 的对象 return new MongoSessionHandler; }); } /** * 在容器中注册绑定关系 * * @return void */ public function register() { // } }
ドライバーの登録が完了したら、構成ファイルconfig/session を使用できます。 #mongo
LearnKu.comドライバーは php
で使用されます。この記事は、