我有两个(但让我们想象更多)微服务(API)需要知道经过身份验证的用户。理想情况下,我想简单地恢复他们的会议。所有微服务都使用相同的会话存储:redis所有API调用都将具有Cookie标头,因此所有服务都将能够基于该Cookie恢复会话。我已经通过PHP $_SESSIONs成功地实现了这一点。现在的问题是:你会如何使用Laravel/Lumen来实现这一点?
ie3xauqp1#
最后更新于2021年3月5日
(This答案得到了Laravel社区的大量关注,所以我想更新它。Laravel已经正式停止支持laravel/lumen框架中的sessions和views,从5.2版本开始。但是laravel仍然有一个可以安装在lumen/framework中的组件illuminate/session,我们可以尝试一下。
laravel/lumen
laravel
lumen/framework
illuminate/session
第一步
安装illuminate/session使用composer require illuminate/session
composer require illuminate/session
第二步
现在后藤bootstrap/app.php并添加此中间件
bootstrap/app.php
$app->middleware([ \Illuminate\Session\Middleware\StartSession::class, ]);
添加上述中间件的目的是在每个请求时启动会话,并在提供响应之前保存会话。
第三步
现在添加config/session.php,因为默认情况下它不存在于Lumen中。您可以从Laravel official repo中获取session.php。
config/session.php
Lumen
session.php
第四步
创建框架会话存储目录
mkdir -p storage/framework/sessions
感谢DayDream
步骤-5
在bootstrap/app.php中添加\Illuminate\Session\SessionManager的绑定
\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'); });
感谢@xxRockOnxx找到loadComponent方法。它需要3个参数,
loadComponent
config
config/
loadComponent只是在构建ServiceProvider时调用$app->register并注入$app
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上添加了从lumen framework v5.6到当前版本v8.0的示例支持。https://github.com/rummykhan/lumen-session-example
67up9zun2#
重要的是你也要使用$request->session(),否则它将无法工作。
$request->session()
oyt4ldly3#
我尝试了上面提到的解决方案,但是,如果使用默认设置,还需要创建一个文件夹storage/framework/sessions。
storage/framework/sessions
chy5wohz4#
公认的答案已经过时了。我回答并解释了一点如何正确地做到这一点在我的回答这个question我也在Laracasts上发布了我的问题是什么引用如下:在你给出的链接中找到的解决方案是,首先它告诉你手动注册SessionManager以防止unresolvable depedency parameter #0 $app,然后还注册现有的SessionServiceProvider,它还绑定了另一个示例SessionManager。问题是,一些组件使用另一个示例,而其他部分使用新的示例,这导致我的auth attempt会话没有被保存,尽管实际上是put内部。
SessionManager
unresolvable depedency parameter #0 $app
SessionServiceProvider
attempt
put
4条答案
按热度按时间ie3xauqp1#
最后更新于2021年3月5日
(This答案得到了Laravel社区的大量关注,所以我想更新它。
Laravel已经正式停止支持
laravel/lumen
框架中的sessions和views,从5.2版本开始。但是
laravel
仍然有一个可以安装在lumen/framework
中的组件illuminate/session
,我们可以尝试一下。第一步
安装
illuminate/session
使用composer require illuminate/session
第二步
现在后藤
bootstrap/app.php
并添加此中间件添加上述中间件的目的是在每个请求时启动会话,并在提供响应之前保存会话。
第三步
现在添加
config/session.php
,因为默认情况下它不存在于Lumen
中。您可以从Laravel official repo中获取session.php
。第四步
创建框架会话存储目录
感谢DayDream
步骤-5
在
bootstrap/app.php
中添加\Illuminate\Session\SessionManager
的绑定感谢@xxRockOnxx找到
loadComponent
方法。它需要3个参数,config
文件名(文件应存在于config/
目录中)loadComponent
只是在构建ServiceProvider
时调用$app->register
并注入$app
如何使用
我还在github上添加了从lumen framework v5.6到当前版本v8.0的示例支持。
https://github.com/rummykhan/lumen-session-example
67up9zun2#
重要的是你也要使用
$request->session()
,否则它将无法工作。oyt4ldly3#
我尝试了上面提到的解决方案,但是,如果使用默认设置,还需要创建一个文件夹
storage/framework/sessions
。chy5wohz4#
公认的答案已经过时了。
我回答并解释了一点如何正确地做到这一点在我的回答这个question
我也在Laracasts上发布了我的问题是什么
引用如下:
在你给出的链接中找到的解决方案是,首先它告诉你手动注册
SessionManager
以防止unresolvable depedency parameter #0 $app
,然后还注册现有的SessionServiceProvider
,它还绑定了另一个示例SessionManager
。问题是,一些组件使用另一个示例,而其他部分使用新的示例,这导致我的auth
attempt
会话没有被保存,尽管实际上是put
内部。