Symfony将部分信息保存在缓存中

时间:2017-10-08 08:06:36

标签: symfony doctrine-orm symfony-3.3 symfony-cache

使用Symfony,我想使用Cache Manager(FilesystemCache)来保存我的实体。我这样做了:

    $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: "contact@site.com"
    -email: "contact@site.com"
    -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: "contact@site.com"
    -email: null
    -plainPassword: null
    -password: "$2y$13$sFSRu2lyDmrfFZP24vkeQOiaYJ5E2eo/kLlaIITgwTrwZunEBcO1q"
    -onlineAt: null
    -changePasswordAt: null
    -roles: []
    -registerToken: null
    -versions: null
    -deletedAt: null
    -deletedBy: null
}

为什么我的第二个 dump()没有所有信息?

1 个答案:

答案 0 :(得分:1)

由于您尝试将对象保存在缓存中,因此必须Serializable告诉PHP应该安全哪些属性,哪些不安全。为了进行比较,您可以了解FOSUserBundle是如何做到的。

对于较大的对象图(对象及其关系,例如versions属性),将所有信息存储在缓存中通常是不可行的,因为这可能会在序列化/反序列化时导致内存问题数据。为此,Symfony UserProvider有一个refreshUser()方法可以重新加载剩余的数据。因此,如果您希望将数据缓存为用户管理的一部分,我建议您实施此方法以确保在调用此方法时获取剩余数据。