laravel 在lumen框架中启用会话

nr7wwzry  于 2023-05-19  发布在  其他
关注(0)|答案(4)|浏览(157)

我有两个(但让我们想象更多)微服务(API)需要知道经过身份验证的用户。理想情况下,我想简单地恢复他们的会议。
所有微服务都使用相同的会话存储:redis
所有API调用都将具有Cookie标头,因此所有服务都将能够基于该Cookie恢复会话。我已经通过PHP $_SESSIONs成功地实现了这一点。
现在的问题是:你会如何使用Laravel/Lumen来实现这一点?

ie3xauqp

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并添加此中间件

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

添加上述中间件的目的是在每个请求时启动会话,并在提供响应之前保存会话。

第三步

现在添加config/session.php,因为默认情况下它不存在于Lumen中。您可以从Laravel official repo中获取session.php

第四步

创建框架会话存储目录

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');
});

感谢@xxRockOnxx找到loadComponent方法。它需要3个参数,

  • config文件名(文件应存在于config/目录中)
  • 第二个是ServiceProvider FQN
  • 第三是这种方法的回归。

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上添加了从lumen framework v5.6到当前版本v8.0的示例支持。
https://github.com/rummykhan/lumen-session-example

67up9zun

67up9zun2#

重要的是你也要使用$request->session(),否则它将无法工作。

oyt4ldly

oyt4ldly3#

我尝试了上面提到的解决方案,但是,如果使用默认设置,还需要创建一个文件夹storage/framework/sessions

chy5wohz

chy5wohz4#

公认的答案已经过时了。
我回答并解释了一点如何正确地做到这一点在我的回答这个question
我也在Laracasts上发布了我的问题是什么
引用如下:
在你给出的链接中找到的解决方案是,首先它告诉你手动注册SessionManager以防止unresolvable depedency parameter #0 $app,然后还注册现有的SessionServiceProvider,它还绑定了另一个示例SessionManager
问题是,一些组件使用另一个示例,而其他部分使用新的示例,这导致我的auth attempt会话没有被保存,尽管实际上是put内部。

相关问题