答案较晚,但是值得一提的是,只要临时存储库有权访问活动会话,就可以对匿名用户使用私有临时存储库。为此,您需要为类注入临时存储,会话和当前用户的服务,如下所示:
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();
}
您可能会发现此方法更可取,因为这意味着您可以使用单个系统进行临时存储,而不管用户是否登录。
(我的代码示例从这个构建多步表单的出色教程中大致逐字逐句地翻译了。)