L5中的扩展会话在请求之间不会持续存在

时间:2015-03-20 23:41:04

标签: php session laravel laravel-5

我正在扩展会话提供程序以保留一些必需的数据。我开始编辑AppServiceProvider's boot method

\Session::extend('desk', function($app)
{
    return new Desk();
}); 

Desk课程如下:

namespace App\Services;


use Illuminate\Session\ExistenceAwareInterface;

class Desk implements \SessionHandlerInterface, ExistenceAwareInterface{

    /**
     * The existence state of the session.

     * @var bool
     */
    protected $exists;

    public function close()
    {
        return true;
    }

    public function destroy($session_id)
    {
        $session = $em->find('Session', $session_id);
        $em->remove($session);
        $em->flush();

        return true;
    }

    public function gc($maxlifetime)
    {
        // TODO: Implement gc() method.
    }

    public function open($save_path, $session_id)
    {
        return true;
    }

    public function read($session_id)
    {
        $session = $em->find('Session', $session_id);

        if ($sesion !== null){
            $this->exists = true;
            return  $session->getPayload();
        }
    }

    public function write($session_id, $session_data)
    {
        $session = $em->find('Session', $session_id);

        if ($session === null){
            $session = new Session($session_id, $session_data);
            $em->persist($session);
        }
        else{
            $session->setPayload($session_data);
        }

        $em->flush();

        $this->exists = true;
    }


    public function setExists($value)
    {
        $this->exists = $value;

        return $this;
    }
}

完成实施后,我将会话配置更改为:

return [
    'driver' => 'desk',
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path().'/framework/sessions',
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'lote_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,
];

当我加载页面时没有问题,但是在成功登录请求然后刷新页面后,会话过期并且用户再次成为访客。我想念一下吗?

其他信息:如果我将会话驱动程序恢复为"文件",一切顺利。

1 个答案:

答案 0 :(得分:0)

那么,对于那些需要/想要扩展像我这样的会话提供者的人来说,请注意会话的表结构。我的错误是payload列设置为:

payload varchar(255) not null

由于laravel序列化数据,有效负载值的长度可能超过255个字符,因此,它会破坏数据并使其不一致。你可以考虑:

payload text not null