0x01 起因一次操作在Controller中删除了Session,然后立马来了一个dd(session(key));很惊讶的发现,Session是空的,但是因为中间键那里是进行了登陆判断的。虽然dd出来的Session是空的,然而访问其它页面居然毫无影响。我第一时间是以为中间键没弄好。经过仔细检查后,发现。。。。
0x02 经过
部分Session操作//session的永久保存(在不过期范围内)
Session::put('key', 'value');
//等同于PHP的原生session
$_SESSION['key'] = 'value';
//get操作
$value = Session::get('key', 'default');
//去除操作并删除,类似pop概念
$value = Session::pull('key', 'default');
//检测是否存在key
Session::has('users');
//删除key
Session::forget('key');
虽然我删除了Session,但是Session好像并没有立即生效。
谷歌后,发现有个方法Session::save(),在销毁了Session后执行下这个,再dd,立马生效了。
在bootstrap/compiled.php中class Middleware implements HttpKernelInterface
{
...
public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
$this->checkRequestForArraySessions($request);
if ($this->sessionConfigured()) {
$session = $this->startSession($request); // 启动session
$request->setSession($session);
}
$response = $this->app->handle($request, $type, $catch); // 调用controller的method
if ($this->sessionConfigured()) {
$this->closeSession($session); //关闭session
$this->addCookieToResponse($response, $session);
}
return $response;
}
...
protected function closeSession(SessionInterface $session)
{
$session->save(); // 保存session
$this->collectGarbage($session);
}
}
可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit或者dd等;,那么session是不会被生效的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。