2012-10-16 18 views
4

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

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

我尝试这样做:

unserialize($data); 

,这把我后续的错误:

Fatal error: Uncaught exception 'ErrorException' with message 'Notice: unserialize() [function.unserialize]: Error at offset 0 of 82 bytes in /myserver/myapp/src/app/myBundle/myCustomPdoSessionStorage.php line 220' in /myserver/myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php:65 Stack trace: #0 [internal function]: 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 [internal function]: app/myBundle/myCustomPdoSessionStorage->sessionWrite('72b823b39d316dd...', '_symfony2|a:3:{...') #3 {main} thrown in /myserver/myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php on line 65

谁能帮助我吗?

+0

的var_dump($数据)''的输出添加到你的问题,以及如何储存之前序列化数据。 – hakre

+0

感谢@hakre您的快速响应!我真的想知道Symfony会话类在哪里执行$ data的序列化,然后调用$ pdoSessionStorageObject-> sessionWrite('.. id_session ..','..data_serialized ..')。像这样:Symfony2-file-that-I-wanna-found.php ...'$ sessId = $ session-> getId(); $ data-as-string = $ session-> serialize(); //会话对象作为字符串$ pdoSessionStorageObject-> sessionWrite($ sessId,$ data-as-string);'我想改变我的自定义sessionWrite方法来获取多一个参数。并且从$ session添加一个自定义属性到这个方法的调用。 – 2ehr

+0

如果添加var_dump,这可能会给它一些启示。如果会话包含秘密数据,请将其屏蔽。 – hakre

回答

1

我找到了!

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

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

所以非常感谢@hakre

2

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

您可能正在寻找session_decode函数。照顾它unserializes到$_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

+0

感谢@hakre可能是我的问题的解决方案,但我不想反序列化完整的会话字符串以获得一个整数(userId)。而不是我想找到Symfony所在的位置:'$ pdoSessionStorageObject-> sessionWrite($ sessId,$ sessSerialized)'并将其替换为'$ pdoSessionStorageObject-> sessionWrite($ sessId,$ sessSerialized,$ userId)'。这样我可以将$ userId作为纯整数发送到$ pdoSessionStorage对象,稍后将该值存储在我的数据库的Session表中作为单独的字段。 很抱歉,如果我以前做过一个过于抽象的问题 – 2ehr

+0

你可能不会有任何运气,如果Symfony2的利用了标准的PHP写处理程序:'写(字符串$的sessionId,字符串$数据)' - 它具有已编码的字符串。您需要在Symfony2代码库中找到该部分,然后在该情况下查看该部分。 – hakre

相关问题