Resposta tardia, mas vale a pena mencionar que você pode usar o tempstore privado para usuários anônimos, desde que o tempstore tenha acesso a uma sessão ativa. Para fazer isso, você precisa injetar sua classe com serviços para o armazenamento temporário, a sessão e o usuário atual, da seguinte maneira:
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')
);
}
Então, você só precisa garantir que você inicie o gerenciador de sessões se o usuário for anônimo, antes de colocar qualquer coisa no armazenamento temporário:
if ($this->currentUser->isAnonymous() && !isset($_SESSION['session_started'])) {
$_SESSION['session_started'] = true;
$this->sessionManager->start();
}
Você pode achar essa abordagem preferível, pois significa que você pode usar um único sistema para armazenamento temporário, independentemente de um usuário estar conectado.
(Meus exemplos de código são extraídos mais ou menos literalmente deste excelente tutorial sobre como criar formulários de várias etapas .)