在流明框架中启用会话

roc*_*k3t 9 laravel microservices lumen

我有两个(但让我们的图像更多)微服务(API)需要知道经过身份验证的用户.理想情况下,我很想恢复他们的会话.

所有微服务都使用相同的存储来进行会话:redis.

所有API调用都将具有Cookie标头,因此所有服务都可以基于该cookie恢复会话.我已经通过PHP $ _SESSIONs成功实现了这一点.

现在的问题是:你将如何与Laravel/Lumen一起实施?

rum*_*han 36

Laravel已经正式停止支持laravel/lumen5.2版本和病房的框架中的会话和观点.

但是laravel仍然有一个illuminate/session可以安装的组件,lumen/framework我们可以玩这个.

步骤1

安装illuminate/session使用

composer require illuminate/session

第2步

现在转到bootstrap/app.php并添加此中间件

$app->middleware([
    \Illuminate\Session\Middleware\StartSession::class,
]);
Run Code Online (Sandbox Code Playgroud)

第3步

由于config/session.php幸运地采用了一个原语Lumen,并且它没有类型暗示,所以我们可以利用它session.php.

bootstrap/app.php添加绑定\Illuminate\Session\SessionManager

mkdir -p storage/framework/sessions
Run Code Online (Sandbox Code Playgroud)

第4步

现在添加loadComponent,因为它config默认不存在.您可以config/Laravel Official Repository中获取.

第5步

添加以下行loadComponent以在容器中加载配置.

$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');
});
Run Code Online (Sandbox Code Playgroud)

第6步

注册会话服务提供商


// 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'),
    ]);
});
Run Code Online (Sandbox Code Playgroud)

因为不像$app->register,你要告诉$app读取配置文件.

如何使用

$app->middleware([
    \Illuminate\Session\Middleware\StartSession::class,
]);
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。这很有帮助 (3认同)
  • 然而,重定向器(例如,在使用 redirect() 时)会话不会被设置,它始终为空。我可以看到在 Request 对象上设置的会话对象,所以我可以正确使用 view()->with() 但是如果我使用 redirect()->with() 它会失败,因为重定向器上的会话对象为空 (2认同)

Kev*_*ton 5

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


doe*_*ter 2

接受的答案已过时。

我在这个问题的回答中回答并解释了如何正确地做到这一点

我还在Laracasts上发布了我的问题是什么问题

去引用:

在您提供的链接中找到的解决方案是,首先它告诉您手动注册以SessionManager防止然后unresolvable depedency parameter #0 $app还注册SessionServiceProvider还绑定另一个实例的现有实例SessionManager

问题是,某些组件使用另一个实例,而其他部分使用新实例,这导致我的身份验证attempt会话尽管实际上在内部,但并未保存put