Пізні відповіді, але варто згадати, що ви можете використовувати приватні темпстори для анонімних користувачів, якщо тимчасовий магазин має доступ до активного сеансу. Для цього вам потрібно присвоїти своєму класу послуги для тимчасового магазину, сеансу та поточного користувача, наприклад:
public function __construct(PrivateTempStoreFactory $temp_store_factory, SessionManagerInterface $session_manager, AccountInterface $current_user) {
$this->tempStoreFactory = $temp_store_factory;
$this->sessionManager = $session_manager;
$this->currentUser = $current_user;
$this->store = $this->tempStoreFactory->get('myclass.storename');
}
public static function create(ContainerInterface $container) {
return new static(
$container->get('user.private_tempstore'),
$container->get('session_manager'),
$container->get('current_user')
);
}
Тоді вам просто потрібно переконатися, що ви запускаєте менеджер сеансів, якщо користувач анонімний, перш ніж вам потрібно щось помістити в тимчасовий магазин:
if ($this->currentUser->isAnonymous() && !isset($_SESSION['session_started'])) {
$_SESSION['session_started'] = true;
$this->sessionManager->start();
}
Цей підхід може бути кращим, оскільки він означає, що ви можете використовувати єдину систему для тимчасового зберігання, незалежно від того, чи користувач увійшов у систему.
(Мої приклади коду підняті більш-менш дослівно з цього чудового посібника зі створення багатошагових форм .)