这是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工作?
答案 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'),
最后,如果您有一个空的存储/框架/会话文件夹,那么您肯定还有问题!!!
答案 2 :(得分:0)
如果您使用 api route ,您的会话可能会遇到此问题,并且大多数时间会话返回 null , 尝试为此使用网络路由