在 Drupal 8 中可以使用 $_SESSION['variables'] 吗?

Is it ok to use $_SESSION['variables'] in Drupal 8?

我需要一种为匿名用户存储临时数据的方法。

显然这是不可能的:

\Drupal::service('user.private_tempstore')

除非你为会话管理和东西写一个自定义构造函数,这对我来说似乎有点牵强?

我试过使用

\Drupal::service('user.shared_tempstore')

但这会为所有匿名用户保存临时数据。所以它没有链接到单个用户。

使用原始 $_SESSION['data'] 工作正常,但我不确定我是否应该在 Drupal 中这样做以及如何 safe/unsafe 做到这一点?

我不回答你的具体问题(关于$_SESSION),因为我已经成功使用:

$session = \Drupal::service('user.private_tempstore')->get('your_module');
$session->set('whatever', $whatever);

在程序代码(即挂钩、主题)中没有问题。

请注意,必须将此私有临时存储分配给一个模块(因为没有更好的表达方式),这就是这一行的目的

$session = \Drupal::service('user.private_tempstore')->get('your_module')

获得私有临时存储后,您现在可以设置和获取会话值:

$session->get('whatever');
$session->set('whatever', $whatever);

编辑

抱歉,您解释正确。我没有得到 100% 的关键部分 ;)

您始终可以从请求中访问 Session 对象。

$session = \Drupal::request()->getSession();
$session->set('whatever', 'hello');
$value = $session->get('whatever', 'default');

会话 (Drupal 8) 通过 SessionInterface 接口的简单会话实现来使用。 See Complete Tutorial of Sessions (Drupal 8).

示例:

use Symfony\Component\HttpFoundation\Session\Session;

$session = new Session();
$session->start();

// set and get session attributes
$session->set('name', 'Yash');
$session->get('name');

// set flash messages
$session->getFlashBag()->add('notice', 'Profile updated');

// retrieve messages
foreach ($session->getFlashBag()->get('notice', array()) as $message) {
    echo '<div class="flash-notice">'.$message.'</div>';
}

我使用纯 PHP $_SESSION 变量已有一段时间了。 对它们进行了一些研究,它们应该可以绝对安全地使用。 它们在我使用它们的任何地方都能正常工作,而且它们已经正常工作了一段时间。

不要认为在 Drupal 8 中使用它们有任何问题。