ホームページ >バックエンド開発 >PHPチュートリアル >Laravel 基本チュートリアル -- セッション

Laravel 基本チュートリアル -- セッション

WBOY
WBOYオリジナル
2016-06-23 13:01:321024ブラウズ

Session

はじめに

HTTP ドライバーはステートレス プロトコルであるため、これは通常、サーバーが現在の要求ユーザーと以前の要求ユーザーの関係を明確に認識していないことを意味し、セッションはこの相互要求ユーザー ソリューションを提供します。 。 Laravel には、さまざまなバックエンド セッション ドライバーをサポートするためのシンプルで統合された API が付属しています。 Laravel は、Memcached、Redis、データベースなどの一般的なバックエンド ドライバーに対するすぐに使用できるサポートを提供します。

設定

セッション設定ファイルは config/session.php に保存されます。このファイルを使用する前に、このファイル内の構成項目のコメントを必ず読んでください。 Laravel は、構成内のすべての項目に詳細な注釈を提供します。デフォルトでは、Laravel はファイルセッションドライバーを使用するように構成されており、ほとんどのアプリケーションにはこれで十分です。ただし、運用環境では、memcached や redis などのメモリ レベルのドライバーを使用することをお勧めします。これにより、アプリケーションのセッション パフォーマンスが大幅に向上します。

各リクエストのセッション データは、定義したセッション ドライバーの場所に保存されます。次のドライバーは、laravel でそのまま使用できます:

  • file - セッションはストレージ/フレームワーク/セッションに保存されます。
  • Cookie - セッションは安全に暗号化された Cookie に保存されます。
  • データベース - セッションはアプリケーションで使用されるデータベースに保存されます。
  • memcached / redis - セッションは、より高速なメモリレベルのストレージ ドライバーに保存されます。
  • 配列 - セッションは PHP の配列に保存されるだけであり、リクエストをまたがってアクセスすることはできません。

注: アレイ ドライバーは通常、永続的なセッション データを回避するためのテストに使用されます。

ドライバーの前提条件

データベース

データベース セッション ドライバーを使用する場合は、まずセッション アイテムを保存するテーブルを作成する必要があります。次の例は、データベース セッション ドライバー テーブルのスキーマ宣言です:

Schema::create('sessions', function ($table) {  $table->string('id')->unique();  $table->integer('user_id')->nullable();  $table->string('ip_address', 45)->nullable();  $table->text('user_agent')->nullable();  $table->text('payload');  $table->integer('last_activity');});

session:table Artisan コマンドを使用して、データベース セッション ドライバー移行テーブルを生成することもできます:

php artisan session:tablecomposer dump-autoloadphp artisan migrate

Redis

Redis セッション ドライバーを使用する前にの場合、Composer を介して predis/predis (~1.0) をインストールする必要があります。

その他のセッションメモ

Laravel フレームワークは内部でセッション内のキーとして Flash を使用するため、セッション内でこの名前のキーを使用することは避けてください。

安全に暗号化されたセッション データを保存する必要がある場合は、構成ファイルで暗号化オプションを true に設定できます。

基本的な使い方

セッションにアクセス

まずはセッションにアクセスしましょう。 HTTP リクエストを通じてセッション インスタンスにアクセスできます。 HTTP リクエストは、コントローラー メソッドのタイプ ヒントを使用して依存関係を注入できます。コントローラーメソッドの依存関係は、Laravel のサービスコンテナーを通じて注入されることを覚えておく必要があります:

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class UserController extends Controller{  /**   * Show the profile for the given user.   *   * @param Request $request   * @param int $id   * @return Response   */   public function showProfile(Request $request, $id)   {     $value = $request->session()->get('key');     //   }}

セッションから値を取得するとき、get メソッドの 2 番目のパラメーターにデフォルト値を指定することもでき、デフォルト値は次のときに返されます。セッションは対応するキーの値を取得しません。対応するキーが見つからない場合は、Closure をデフォルト値として渡すこともできます。

$value = $request->session()->get('key', 'default');$value = $request->session()->get('key', function () {  return 'default'; });

セッションからすべての値を取得したい場合は、Closure の実行結果によって返される値がデフォルト値として使用されます。 all メソッドを使用できます:

$data = $request->session()->all();

グローバル ヘルパー メソッドのセッションを使用して値を取得および保存できます:

Route::get('home', function () {  // Retrieve a piece of data from the session...  $value = session('key');  // Store a piece of data in the session...  session(['key' => 'value']);});

セッション内に特定の項目が存在するかどうかを判断します

has メソッドを使用して、セッションに項目が含まれている場合は、true を返します:

if ($request->session()->has('user')) {  //}

セッションにデータを保存します

セッションのインスタンスを取得すると、基になるデータを操作できるようになり、さまざまなインスタンスを通じて操作できるようになります。方法。たとえば、put メソッドを使用して、セッションに新しいデータ項目を保存できます。

$request->session()->put('key', 'value');

値が配列であるセッション内の項目にコンテンツをプッシュします

新しい値をプッシュするために、push メソッドを使用できます。セッションへの挿入 値は配列内の項目です。たとえば、user.teams キーがセッション内の配列のパスを示している場合、次のように配列に新しい値をプッシュできます:

$request->session()->push('user.teams', 'developers');

アイテムを取得して削除します

pull メソッドはそれを取得しますセッション内の項目を削除します:

rrree

セッション内の項目を削除します

すべてのデータを削除したい場合は、forget メソッドを使用して、セッション内のデータの項目を削除できます。セッションでは、flush メソッドを使用できます:

rrree

セッション ID を再生成します

セッション ID を再生成する必要がある場合は、regenerate メソッドを使用できます:

$request->session()->regenerate();

闪存数据

有时候你希望在 session 中存储某些数据,但是只允许下一次请求时使用,使用后即消除。那么就可以使用 flash 方法。这方法在 session 中存储的数据只能在随后的请求中进行访问,并且在之后删除。闪存的数据通常用来做一些临时的状态消息:

$request->session()->flash('status', 'Task was successful!');

如果你需要维持闪存的数据到更多的请求,你可以使用 reflash 方法,它会维持所有的闪存数据到额外的请求中。如果你只需要维持指定的闪存数据,你可以使用 keep 方法:

$request->session()->reflash();$request->session()->keep(['username', 'email']);

添加自定义的 Session 驱动

你需要使用 Session 假面的 extend 方法才能添加额外的 session 驱动到 Laravel 中。你可以在服务提供者的 boot 方法中来调用 extend 方法:

<?phpnamespace App\Providers;use Session;use App\Extensions\MongoSessionStore;use Illuminate\Support\ServiceProvider;class SessionServiceProvider extends ServiceProvider{  /**   * Perform post-registration booting of services.   *   * @return void   */   public function boot()   {     Session::extend('mongo', function ($app) {       // Return implementation of SessionHandlerInterface...       return new MongoSessionStore;     });   }   /**    * Register bindings in the container.    *    * @return void    */    public function register()    {      //    }}

你应该注意你的自定义 session 驱动应该实现 SessionHandlerInterface 接口。该接口仅包含了几个简单的需要实现的方法。一个实现了的 MongoDB 驱动的结构应该像下面一样:

<?phpnamespace App\Extensions;class MongoHandler 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) {}}

由于这些方法并不像缓存的 StoreInterface 那样难于理解。所以,我们就来快速的过一下吧:

  • open 方法一般用于基于文件的 session 存储系统。由于 laravel 已经附带了 file session 驱动,所以你几乎不需要在这个方法中添加任何的代码。你可以直接放置其为空方法。事实上,这是一种可怜的接口设计(我们将会在后面讨论它),PHP 必须要我们实现这个方法。
  • close 方法,类似于 open 方法,你也可以对其进行忽视,对于大多数驱动来说根本不需要。
  • read 方法应该根据给定的 $sessionId 返回 session 中关联数据的字符串版本。你不需要在存储或检索时做任何的序列化或其它的编码操作,因为 laravel 会为你执行序列化服务。
  • destroy 方法应该从 session 存储中删除所关联的数据。
  • gc 方法应该根据给定的 $lifetime UNIX 时间戳删除 session 所关联的过期数据。对于拥有自动过期能力的系统,比如 Memcached 和 Redis,你可以直接让这个方法为空。

一旦你的 session 驱动被注册。你就可以在 config/session.php 配置文件中使用 mongo 驱动了。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。