認証されたユーザーを認識する必要がある2つのマイクロサービス(API)があります(もっとイメージしましょう)。理想的には、セッションを再開したいと思います。
すべてのマイクロサービスは、セッションに同じストレージを使用しています:redis。
すべてのAPI呼び出しにはCookieヘッダーがあるため、すべてのサービスはそのCookieに基づいてセッションを再開できます。 PHP $ _SESSIONs。
さて、質問:Laravel/Lumenでこれを実装するにはどうしますか?
受け入れられた回答は古くなっています。
私は答えて、これに関する私の答えで適切にそれを行う方法を少し説明しました 質問
Laracasts にも質問の問題点を投稿しました
引用するには:
あなたが与えたリンクで見つかった解決策は、最初に
SessionManager
を手動で登録してunresolvable depedency parameter #0 $app
次に、別のインスタンスSessionServiceProvider
もバインドする既存のSessionManager
を登録します。つまり、一部のコンポーネントは他のインスタンスを使用し、他の部分は新しいインスタンスを使用するため、実際には
attempt
の内部にあるにもかかわらず、認証put
セッションが保存されません。
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/
ディレクトリに存在する必要があります)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にサンプルを追加しました。
$request->session()
も使用することが重要です。それ以外の場合は機能しません。
上記の解決策を試しましたが、フォルダを作成することも必要ですstorage/framework/sessions
デフォルト設定を使用する場合。
次のリンクはライフセーバーです。 ここ