在会话Drupal 8期间保存用户输入的最佳做法

时间:2017-05-09 21:28:59

标签: php session drupal-8

我正在使用Drupal8开发一个网站。我想知道存储对于会话长度很重要的用户特定数据是一种好的做法。例如,假设用户是学校的学生,并且正在学习不同的课程/课程。登录后,用户选择其中一个课程,然后只能查看该特定课程的所有内容/其他学生/ ....

我能想到的最简单的解决方案就是将数据存储在$ _SESSION对象中。但是drupal中的所有视图都必须从这个对象中读取数据,据我所知,这在Drupal7中可以使用自定义php代码,但在Drupal8视图中不再存在。

另外,如果我想永久存储用户的默认首选项,我可以创建一个自定义内容类型'user_config_data'或类似的东西,其中我存储对当前会话很重要的信息(并且需要是在每个视图中访问等)以及默认选择的值(即用户在登录后希望看到的默认课程)

后者也可能通过cookies实现?!

我没想到的其他东西?

在性能,良好的编码实践,可修改性方面,是否有任何方法更有/更不利?感谢您对此的任何想法。

2 个答案:

答案 0 :(得分:1)

PrivateTempStore正是您所寻找的。您可以使用它在整个会话中为每个用户存储数据。

您可以像这样使用

$tempStoreService = \Drupal::service('user.private_tempstore');

// Set a variable in the tempstore
$tempStoreService->set('user_data', $data);

// Get a variable from the tempstore
$userData = $tempStoreService->get('user_data');

这适用于整个用户会话。如果您需要在用户之间共享数据,可以使用SharedTempStore

答案 1 :(得分:0)

我对此做了更多阅读,现在我正在使用VJamie所示的$tempStoreService。为了使参数在Drupal 8视图中可用,我创建了一个自定义模块来实现hook_views_pre_view()并将我的值作为参数添加到视图中。然后我在视图中使用上下文过滤器以确保使用该参数。但是,视图的预览效果很好,但在真实页面上,无论我给出什么参数,视图都会被缓存,输出也是一样的。只有在禁用整个视图的缓存时才有效。这是一种标准方法,还是上下文过滤器的缓存问题有不同的解决方案?