2012-08-08 49 views
0

存儲序列化對象,我有存儲物體進入會議在會議

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

服務類,我得到了會議的序列化對象:

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

但結果不是存儲對象的實例。

會話包含此序列串:

串(221) 「A:2:{I 0,O:68:」 的Symfony \元器件\ HttpFoundation \的sessionStorage \ NativeSessionStorage「:1:{ S:10: 「*選項」;一個: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」;}」

設置對象的保護不工作的所有屬性。 我在做什麼錯?

回答

5

會話級>序列化()和反序列化()不會做你認爲他們這樣做,他們不序列化和反序列化對象,他們序列化和反序列化整個會話。他們不帶任何參數,事實上已經在Symfony的2.1

只需將對象插入到會話和Symfony的會照顧序列化和反序列化它爲你的被刪除,只需使用:

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

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

在任何情況下,如果你真的需要整個對象存儲到會話中,你可能會重新考慮。如果這是一個大對象,這可能是非常低效的。如果是這種情況並且對象存儲在數據庫中,則可以只存儲該對象的ID,然後在需要時從ID重新加載該對象。

+0

它的工作原理,謝謝!存儲的obj很小,並沒有存儲在數據庫中 – Neka 2012-08-09 01:21:09

1

其實,這是不正確的的Symfony會照顧的序列化和反序列化對象的爲您服務。

它可以是標準的Symfony對象真(如Request對象,讓我們說),但如果你想存儲您的自定義對象,而無需執行連載()反序列化()方法,的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; 
    } 
}