web-dev-qa-db-ja.com

Lumenフレームワークでのセッションの有効化

認証されたユーザーを認識する必要がある2つのマイクロサービス(API)があります(もっとイメージしましょう)。理想的には、セッションを再開したいと思います。

すべてのマイクロサービスは、セッションに同じストレージを使用しています:redis。

すべてのAPI呼び出しにはCookieヘッダーがあるため、すべてのサービスはそのCookieに基づいてセッションを再開できます。 PHP $ _SESSIONs。

さて、質問:Laravel/Lumenでこれを実装するにはどうしますか?

10
rock3t

受け入れられた回答は古くなっています。

私は答えて、これに関する私の答えで適切にそれを行う方法を少し説明しました 質問

Laracasts にも質問の問題点を投稿しました

引用するには:

あなたが与えたリンクで見つかった解決策は、最初にSessionManagerを手動で登録してunresolvable depedency parameter #0 $app次に、別のインスタンスSessionServiceProviderもバインドする既存のSessionManagerを登録します。

つまり、一部のコンポーネントは他のインスタンスを使用し、他の部分は新しいインスタンスを使用するため、実際にはattemptの内部にあるにもかかわらず、認証putセッションが保存されません。

2
doesnotmatter

2019年7月18日の更新

(この答えはLaravelコミュニティから多くの注目を集めていたので、更新することを考えました。)

Laravelは、バージョン5.2以降のlaravel/Lumenフレームワークでのセッションとビューのサポートを正式に停止しています。

ただし、laravelにはilluminate/sessionにインストールできるコンポーネントLumen/frameworkがまだあり、これで遊ぶことができます。

ステップ-1

インストールilluminate/sessionを使用して

composer require illuminate/session

ステップ-2

bootstrap/app.phpに移動して、このミドルウェアを追加します

$app->middleware([
    \Illuminate\Session\Middleware\StartSession::class,
]);

上記のミドルウェアを追加する目的は、すべての要求でセッションを開始し、応答を提供する前にセッションを保存することです。

ステップ-3

config/session.phpはデフォルトでLumenに存在しないため、ここで追加します。 Laravel公式リポジトリ からsession.phpを取得できます。

ステップ-4

フレームワークセッションストレージディレクトリを作成する

mkdir -p storage/framework/sessions

おかげで DayDream

ステップ-5

bootstrap/app.php\Illuminate\Session\SessionManagerのバインディングを追加

$app->singleton(Illuminate\Session\SessionManager::class, function () use ($app) {
    return $app->loadComponent('session', Illuminate\Session\SessionServiceProvider::class, 'session');
});

$app->singleton('session.store', function () use ($app) {
    return $app->loadComponent('session', Illuminate\Session\SessionServiceProvider::class, 'session.store');
});

loadComponentメソッドを見つけてくれた @ xxRockOnxx に感謝します。それは3つの引数を取ります、

  • 最初はconfigファイル名です。 (ファイルはconfig/ディレクトリに存在する必要があります)
  • 2番目はServiceProvider FQNです
  • 3番目は、このメソッドの戻りです。

loadComponentは、ServiceProviderのビルド中に$app->registerを呼び出して$appを挿入するだけです

使用方法


// Save Session
$router->get('/', function (\Illuminate\Http\Request $request) {

    $request->session()->put('name', 'Lumen-Session');

    return response()->json([
        'session.name' => $request->session()->get('name')
    ]);
});


// Test session
$router->get('/session', function (\Illuminate\Http\Request $request) {

    return response()->json([
        'session.name' => $request->session()->get('name'),
    ]);
});

Githubにサンプルを追加しました。

https://github.com/rummykhan/Lumen-session-example

41
rummykhan

$request->session()も使用することが重要です。それ以外の場合は機能しません。

5
Kevin Upton

上記の解決策を試しましたが、フォルダを作成することも必要ですstorage/framework/sessionsデフォルト設定を使用する場合。

4
Daydream

次のリンクはライフセーバーです。 ここ

1
Kevin RED