将序列化对象存储在会话中

时间:2012-08-08 04:02:27

标签: symfony

我有一个将对象存储到会话中的Service类

$this->session->set('utmUser', $this->session->serialize($this->utmUser));

我从会话中获得了反序列化的对象:

$this->utmUser = $this->session->unserialize($this->session->get('utmUser'));

但结果不是存储对象的实例。

会话包含此序列化字符串:

  

string(221)“a:2:{i:0; O:68:”Symfony \ Component \ HttpFoundation \ SessionStorage \ NativeSessionStorage“:1:{s:10:”* options“; a:5:{ S:8: “寿命”; I:0; S:4: “路径”; S:1: “/”; S:6: “结构域”; S:0: “”; S:6: “安全” ; b:0; S:8: “仅Http”; b:0;}} I:1; S:2: “EN”;}“

将对象的所有属性设置为受保护不起作用。 我做错了什么?

2 个答案:

答案 0 :(得分:5)

session-> serialize()和unserialize()不执行您认为的操作,它们不会序列化和反序列化对象,它们会序列化和反序列化整个会话。它们没有采用任何参数,实际上已经在Symfony 2.1中删除了

您可以将对象设置为会话,Symfony将负责为您序列化和反序列化,只需使用:

$this->session->set('utmUser', $this->utmUser);

$this->utmUser = $this->session->get('utmUser');

在任何情况下,如果您确实需要将整个对象存储到会话中,您可能会重新考虑。如果这是一个大对象,这可能是非常低效的。如果是这种情况并且对象存储在数据库中,则可以只存储对象的id,然后在需要时从id重新加载它。

答案 1 :(得分:1)

实际上,并不是说Symfony会为你处理对象的序列化和反序列化。

对于标准Symfony对象(比如Request对象,可以说),但是如果要存储自定义对象而不实现 serialize() unserialize()< / em>方法, Symfony / PHP将崩溃

此外,它在保存对象时不会崩溃,而是从数据库加载会话(特别是在每个session_start()调用时)。所以它可能会带来很多麻烦 - 你不会看到任何错误,只是无限加载页面!

解决方案:只需实现\ Serializable接口即可。例如:

namespace AppBundle\Event;

use Symfony\Component\EventDispatcher\GenericEvent;

class MyEvent extends GenericEvent implements \Serializable
{

  /* ... */

  public function serialize()
  {
    return serialize(
      [
        $this->property1,
        $this->property2,
      ]
    );
  }

  public function unserialize($serialized)
  {
    $data = unserialize($serialized);
    list(
      $this->property1, 
      $this->property2,
      ) = $data;
  }
}