Laravel 5 - 会话无效

Laravel 5 - session doesn't work

这里是config/session.php

return [
    'driver' => 'file',
    'files' => storage_path().'/framework/sessions',
];

我的 storage/framework/sessions 有 755 个权限。

当我将这两行放入我的控制器时

Session::set('aa', 'bb');
dd(Session::get('aa'));

我收到预期的 "bb" 输出。但是如果我评论第一行:

// Session::set('aa', 'bb');
dd(Session::get('aa'));

并刷新页面,我仍然期待 "bb" 但得到 null

此外,storage/framework/sessions 为空。

我应该怎么做才能让 Session 工作?

Laravel 5 通过名为 StartSession 的中间件 class 处理会话。更重要的是,这个中间件是一个 TerminableMiddleware ,实际保存数据的代码(在你的例子中是保存到会话文件中)位于 terminate 方法中,最后是 运行请求生命周期:

public function terminate($request, $response)
{
    if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions())
    {
        $this->manager->driver()->save();
    }
}

当调用 dd(Session::get('aa')); 时,在可以调用中间件的 terminate 方法之前请求被中断。

有趣的是,Laravel Middleware Documentation 实际上以 Laravel StartSession 中间件为例解释了可终止中间件逻辑:

For example, the "session" middleware included with Laravel writes the session data to storage after the response has been sent to the browser.

也就是说,尝试使用 var_dump() 而不是 dd()

使用 laravel 5.*,您必须像下面这样更改内核文件:

  'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:60,1',
            'bindings',
        ],

然后转到 storage/framework/session 文件夹并将权限更改为 755(如果它还有其他数量),然后删除 storage/framework/session 路径中的所有文件,再次使用您的代码将内容放入会话中,观看 storage/framework/session 文件夹。

如果你的会话工作,你现在可以看到属于会话的奇怪的长文件,你就完成了!

如果您的问题还没有解决,请转到config/session并更改:

'driver' => env('SESSION_DRIVER', 'file')

到另一个预定义的数量,例如:

'driver' => env('SESSION_DRIVER', 'array'),

甚至

'driver' => env('SESSION_DRIVER', 'database'),

最后,如果你有一个空文件夹 storage/framework/session,你肯定还有问题!!!

如果您使用 api 路由,您的会话可能会遇到此问题,并且大多数时候会话 return null , 为此尝试使用网络路由