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()
метод, который перезагружает оставшиеся данные. Поэтому, если вы хотите кэшировать данные как часть управления пользователями, я предлагаю вам реализовать этот метод, чтобы убедиться, что оставшиеся данные выбираются при каждом вызове этого метода.