2017-10-08 106 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()方法重新加载其余的数据。所以如果你想缓存数据作为用户管理的一部分,我建议你实现这个方法来确保在调用这个方法时获取剩余的数据。