2017-10-08 103 views
0

使用Symfony,我想使用Cache Manager(FilesystemCache)來保存我的實體。我這樣做:Symfony在緩存中保存部分信息

$find = $this->entityManager->getRepository(User::class) 
     ->getSingleResult([ 
      'whereId' => $id, 
     ]); 

    dump($find); // First dump() 
    $this->cacheManager->set('user-1', $find); 
    dump($this->cacheManager->get('user-1')); // Second dump() 

首先轉儲:

User {#457 ▼ 
    -id: 1 
    -username: "[email protected]" 
    -email: "[email protected]" 
    -plainPassword: null 
    -password: "$2y$13$sFSRu2lyDmrfFZP24vkeQOiaYJ5E2eo/kLlaIITgwTrwZunEBcO1q" 
    -onlineAt: DateTime {#432 ▶} 
    -changePasswordAt: null 
    -roles: array:3 [▶] 
    -registerToken: null 
    -versions: PersistentCollection {#558 ▶} 
    -deletedAt: null 
    -deletedBy: null 
} 

二轉儲:

User {#188 ▼ 
    -id: 1 
    -username: "[email protected]" 
    -email: null 
    -plainPassword: null 
    -password: "$2y$13$sFSRu2lyDmrfFZP24vkeQOiaYJ5E2eo/kLlaIITgwTrwZunEBcO1q" 
    -onlineAt: null 
    -changePasswordAt: null 
    -roles: [] 
    -registerToken: null 
    -versions: null 
    -deletedAt: null 
    -deletedBy: null 
} 

爲什麼我的第二個轉儲()沒有所有的信息?

回答

1

由於您試圖在緩存中保存一個對象,它必須是Serializable才能告訴PHP哪些屬性應該被保護,哪些不應該被保護。爲了比較,你可以看看FOSUserBundle是如何做到的。

對於較大的對象圖(對象及其關係,例如您的versions屬性),將所有信息存儲在緩存中通常是不可行的,因爲這可能在序列化/反序列化數據時導致內存問題。爲此Symfony的UserProvider有一個refreshUser()方法重新加載其餘的數據。所以如果你想緩存數據作爲用戶管理的一部分,我建議你實現這個方法來確保在調用這個方法時獲取剩餘的數據。