Symfony在缓存中保存部分信息
问题描述:
使用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
}
为什么我的第二个转储()没有所有的信息?
答
由于您试图在缓存中保存一个对象,它必须是Serializable才能告诉PHP哪些属性应该被保护,哪些不应该被保护。为了比较,你可以看看FOSUserBundle是如何做到的。
对于较大的对象图(对象及其关系,例如您的versions
属性),将所有信息存储在缓存中通常是不可行的,因为这可能在序列化/反序列化数据时导致内存问题。为此Symfony的UserProvider有一个refreshUser()
方法重新加载其余的数据。所以如果你想缓存数据作为用户管理的一部分,我建议你实现这个方法来确保在调用这个方法时获取剩余的数据。