Symfony2:如何使用自定义PdoSessionStorage将会话属性保存为DB上的自定义字段?

时间:2012-10-16 12:29:38

标签: php session symfony pdo session-variables

我有一个扩展PdoSessionStorage的自定义类,但我不知道如何从会话中捕获属性以将它们保存为数据库中的独立字段。

其他可能性是在我的自定义PdoSessionStorage类的sessionWrite($ if,$ data)方法中反序列化会话数据。但我不知道如何反序列化$ data字符串以获取我想要的数据。

我试过了:

 unserialize($data);

这给我发了以下错误:

  

致命错误:未捕获异常'ErrorException',带有消息'注意:unserialize()[function.unserialize]:/myserver / myapp / src / app / myBundle / myCustomPdoSessionStorage.php第220行中偏移量为0的82字节错误在/myserver/myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php:65堆栈跟踪:#0 [内部函数]:Symfony \ Component \ HttpKernel \ Debug \ ErrorHandler-> handle(8 ,'unserialize()[...','/ Applications / M ...',220,Array)#1 /myserver/myapp/src/app/myBundle/myCustomPdoSessionStorage.php(220):unserialize('_ symfony2 | a:3:{...')#2 [内部函数]:app / myBundle / myCustomPdoSessionStorage-> sessionWrite('72b823b39d316dd ...','_ _ symfony2 | a:3:{...')#3 {在第65行的/myserver/myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php中抛出

有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

你在这里使用了错误的功能。 unserialize用于序列化值,但不用于会话。即使这两者彼此接近,它们也是不同的。

您可能正在寻找session_decode功能。注意它反序列化到$_SESSION超全局,所以你可能想要包装它:

function unserialize_session($data) {
    $hasBuffer = isset($_SESSION);
    $hasBuffer && $buffer = $_SESSION;
    session_decode($data);
    $session = $_SESSION;
    $hasBuffer ? $_SESSION = $buffer : unset($_SESSION);
    return $session;
}

对应方是session_encode,其工作方式类似。

另请参阅:How to unserialize session data in a custom handler

答案 1 :(得分:1)

我找到了它!

我的CustomPdoSessionStorage类扩展了NativeSessionStorage,它管理$_SESSION数组(读,写等)。

所以,从我的课程中我可以使用$this->read('userId')并将其存储在我的数据库中。

非常感谢@hakre