laravel 使用 session 碰到问题解决和解决办法

阅读数: 1571 2018年09月19日

使用全局函数session()可以保存session,但是获取不到。


1、路由要使用的中间件里面必须含有 \Illuminate\Session\Middleware\StartSession::class,这样才能开启 session。

修改app/Http/Kernel.php文件,如下:

protected $middlewareGroups = [
        //中间件web
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            //看到这里了吗!StartSession!!!!要把路由放在这个中间件了才会启动Session!!
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
 
        'api' => [
            'throttle:60,1',
        ],
    ];


2、控制器里面没有 return,而直接 die()、exit(),导致 session 并没有保存。

因为:Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次 put 操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在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,那么 session 是不会被保存的,除非主动的写 Session::save() 才能手工的保存起来,或者把 die(); exit(); 换成 return。

参考资料
https://blog.csdn.net/two_steps/article/details/80167504
phpriji.cn | 网站地图 | | 沪ICP备17015433号-1