Laravel 5 - 会话不起作用

时间:2015-03-30 12:52:07

标签: php session laravel laravel-5

这是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工作?

3 个答案:

答案 0 :(得分:18)

Laravel 5通过名为StartSession的中间件类处理会话。更重要的是,这个中间件是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中间件为例:

  

例如,Laravel附带的“会话”中间件在将响应发送到浏览器后将会话数据写入存储

话虽如此,请尝试使用var_dump()而不是dd()

答案 1 :(得分:1)

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

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

然后转到storage / framework / session文件夹,并将权限更改为755(如果还有其他权限),然后删除storage / framework / session路径中的所有文件,再次使用代码在会话中添加内容,观看存储/框架/会话文件夹。

如果您的会话工作正常,那么您现在可以看到属于该会话的奇怪的长文件,您已经完成了!

如果您的问题尚未解决,请转到config / session并进行更改:

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

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

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

甚至

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

最后,如果您有一个空的存储/框架/会话文件夹,那么您肯定还有问题!!!

enter image description here

答案 2 :(得分:0)

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