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