Перейти к основному содержанию

Хранение данных сеанса с Drupal 8

Недавно мне нужно было временно хранить информацию, связанную с сеансом пользователя, в Drupal 8. В прошлых версиях Drupal я мог просто добавить данные $_SESSION. В Drupal 8 есть сервис для этого; фактически две службы: используют user.private_tempstoreи user.shared_tempstore для временного хранения пользовательских и не пользовательских данных соответственно.


Если вы новичок в Drupal 8, есть ряд принципов ООП и конкретных концепций Symfony, которые стоит узнать. Этот пост не имеет прямого отношения к этому. Здесь я просто кратко расскажу о хранении временных данных (или записи в $_SESSION).

Способ первый: используйте «\ Drupal :: service ()»
Статический вызов user.private_tempstore прост и удобен практически из любого места в вашем приложении. Это особенно полезно для доступа к user.private_tempstore сервису из процедурного кода (т. е. Любой реализации хука или простой функции в вашем приложении).

Чтобы установить временные данные:

// Для "mymodule_name" подойдет любое уникальное пространство имен. 
// Я бы, вероятно, использовал "mymodule_name" большую часть времени. 
$ tempstore = \ Drupal :: service ( 'user.private_tempstore' ) -> get ( 'mymodule_name' ) ;
$ tempstore -> set ( 'my_variable_name' , $ some_data ) ;

Чтобы прочитать временные данные:

$ tempstore = \ Drupal :: service ( 'user.private_tempstore' ) -> get ( 'mymodule_name' ) ;
$ some_data = $ tempstore -> get ( 'my_variable_name' ) ;

Способ второй: использование инъекций зависимостей
В классах контроллера или плагина используйте внедрение зависимостей и Symfony ContainerInterface для внедрения user.private_tempstore в качестве зависимости.

Вот как использовать внедрение зависимостей в контроллере Drupal 8:

namespace Drupal\my_module;
 
use Drupal\Core\Controller\ControllerBase;
use Drupal\user\PrivateTempStoreFactory;
 
 
class MyModuleController extends ControllerBase {
 
  protected $tempStore;
 
  // Передаем зависимость в конструктор объекта.
  public function __construct(PrivateTempStoreFactory $temp_store_factory) {
   // Для "mymodule_name" любое уникальное пространство имен будет делать
    $this->tempStore = $temp_store_factory->get('mymodule_name');
  }
 
   // Использует Symfony ContainerInterface для объявления зависимости, передаваемой в конструктор
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('user.private_tempstore')
    );
  }
 
  // Сохраняем некоторые временные данные 
  public function index() {
    $this->tempStore->set('my_variable_name', $some_data);
    // Делаем другие вещи, возвращаем массив рендеринга и т. д ... 
  }
 
  // Читаем некоторые временные данные 
  public function listPage() {
    $visited = $this->tempStore->get('my_variable_name');
    // Делаем другие вещи, возвращаем массив рендеринга и т.д ... 
  }
 
}

 Для реального примера класса Drupal 8, который использует внедрение зависимостей, посмотрите \ Drupal \ user \ Form \ UserMultipleCancelConfirm в ядре Drupal.

Оба метода примерно эквивалентны:

// Сохраняем данные: 
$ _SESSION [ 'mymodule_name' ] [ 'my_variable_name' ] = $ somedata ; // Получить данные: $ somedata = $ _SESSION [ 'mymodule_name' ] [ 'my_variable_name' ] ;

Но (и это важно ) использование сервисов Drupal 8 обеспечивает необходимую абстракцию и структуру для взаимодействия с глобальной конструкцией. Это часть общей архитектуры, которая позволяет разработчикам устойчиво создавать и расширять сложные приложения.

Теги

Добавить комментарий

Restricted HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Нажимая кнопку "Отправить комментарий", Вы автоматически соглашаетесь с политикой конфиденциальности и даете свое согласие на обработку персональных данных. Ваши данные не будут переданы третьим лицам.
Top