Symfony сохраняет частичную информацию в кеше

С 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
}

Почему мой второй дамп () не имеет всей информации?

1 ответ

Поскольку вы пытаетесь сохранить объект в кэше, он должен быть Serializable, чтобы сообщить PHP, какие свойства должны быть сохранены, а какие нет. Для сравнения вы можете посмотреть, как это делает FOSUserBundle.

С большими графами объектов (объекты и их отношения, такие как ваш versions свойство), как правило, невозможно хранить всю информацию в кэше, так как это может вызвать проблемы с памятью при сериализации / десериализации данных. Для этого у Symfony UserProvider есть refreshUser() метод, который перезагружает оставшиеся данные. Поэтому, если вы хотите кэшировать данные как часть управления пользователями, я предлагаю вам реализовать этот метод, чтобы убедиться, что оставшиеся данные выбираются при каждом вызове этого метода.

Другие вопросы по тегам