2017-01-19 7 views
2

Мне нужен способ хранения временных данных для анонимных пользователей.

Видимо, это не представляется возможным с:

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

Если вы не написать специальный конструктор для управления сеансами и прочее, что кажется немного надуманным мне?

Я попытался с помощью

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

Но что сохраняет данные временные для всех анонимных пользователей. Поэтому он не связан ни с одним пользователем.

Использование raw $ _SESSION ['data'] отлично работает, но я не уверен, что я должен делать это в Drupal и как безопасно/небезопасно это делать?

ответ

0

Я использую простые PHP $ _SESSION переменные на некоторое время теперь. Проведено некоторое исследование, и они должны быть абсолютно безопасны в использовании. Они работают правильно везде, где я их использую, и они работали правильно некоторое время.

Не думаю, что есть какие-либо проблемы с использованием их в Drupal 8.

3

Я не отвечаю на ваш конкретный вопрос (относительно $_SESSION), потому что я успешно использовал:

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

изнутри процедурного кода (то есть крючки, темы) без проблем.

Обратите внимание, что этот частный tempstore должен быть назначен модуль (из-за отсутствия лучшего способа говорить это), который является целью этой линии

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

После того, как вы получите частный tempostore вас Теперь можно установить и получить значения сеанса:

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

EDIT

к сожалению, вы объяснили правильно. Я не получил критическую часть на 100%;)

Вы всегда можете получить доступ к объекту Session из запроса.

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

Не работает для анонимных пользователей, следует, вероятно, сделал, что более очевидно в моем первоначальном вопросе. –

+0

@PascalClaes Вы объяснили правильно. Я не получил критическую часть :) Я отредактировал ответ. –

+0

Будет ли это создавать уникальную сессию для каждого уникального анонимного посетителя? –

2

Сессии (Drupal 8) используются посредством простой реализации Session интерфейса 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>'; 
} 
+0

Должен проверить это, прежде чем принимать ответ, но выглядит очень полезно! –

+0

Да, выглядит хорошо, однако требуется больше тестирования. Генерирует такие ошибки; RuntimeException: Не удалось запустить сеанс: уже запущен PHP. в Symfony \ Component \ HttpFoundation \ Session \ Storage \ NativeSessionStorage-> start() (строка 131 из /vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php). – user25794