Недавно мне нужно было реализовать хранение информации связанной с сеансом пользователя, в 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 обеспечивает необходимую абстракцию и структуру для взаимодействия с глобальной конструкцией. Это часть общей архитектуры, которая позволяет разработчикам создавать и расширять сложные приложения.