Drupal 8: State API или замена variable_get() и variabe_set()

Часто при написании модуля, появляется необходимость записать какие-то данные в переменную, которую можно будет затем в любой момент поправить и использовать. Объявлять свою табличку в модуле для этого может оказаться жирным, а использование конфигураций - неоправданным. В Drupal 7 для этого были две функции variable_get() и variable_set(). В Drupal 8 они были заменены на State API.

Данный API должен использоваться в обход конфигураций только тогда, когда ваша цель использования удовлетворяет требованиям:

  • Этот API будет использоваться для хранения какой-то системной информации;
  • Вы не хотите переносить данные настройки с сервера на сервер, а также из различных окружений (например с dev на production);
  • Эти данные не будут редактироваться пользователем через интерфейс.

Пример использования State API - хранение таймштампа последнего запуска cron операций.

Запись значений

Для записи используется пара ключ, значение.

\Drupal::state()->set('key','value');

Для множественной записи используется следующий код:

// $values - массив с парами ключ и значение.
$values = [
  'key' => 'value',
  'key2' => 'value2'
];
\Drupal::state()->setMultiple($values);

Получение данных

Получение одного значения по ключу.

$val = \Drupal::state()->get('key');

Получение сразу нескольких значений.

$keys = [
  'key',
  'key2'
];
$pairs = \Drupal::state()->getMultiple($keys);

Удаление данных

Удаление доступно лишь по одному значению.

\Drupal::state()->delete('key');

Вот так заменили две переменные на ООП вариант. С приходом конфигураций, надобность в них сильно уменьшится.

Комментарии

Комментарии временно отключены

Слишком много спама. Нужно немного времени чтобы реализовать инструменты для модерации спама через Телеграм и вернуть их обратно.

Ivan
пн, 04/03/2019 - 12:31

"Эти данные не будут редактироваться пользователем через интерфейс." - объясните, пожалуйста, почему не стоит использовать хранение данных в states, если я планирую редактировать их например в админке?

Murz
пт, 14/06/2019 - 10:23

Потому что это не считается надёжным и постоянным хранилищем для важных данных. Для хранения настроек модуля лучше использовать хранилище конфигураций, его можно и сохранить и экспортировать и синхронизировать.

Murz
пт, 14/06/2019 - 10:24

Вот пример создания конфигурации https://niklan.net/blog/179

Murz
пт, 14/06/2019 - 10:17

А хранилище \Drupal::state() - общее для всех модулей, или у каждого модуля своё отдельное со своим неймспейс? Ну т.е. нужно вручную следить за отсутствием коллизий типа: $val = \Drupal::state()->get('cron'); добавляя префиксы с названием своего модуля: $val = \Drupal::state()->get('mymodule.cron'); или об этом уже позаботился Друпал?

Niklan
пт, 14/06/2019 - 11:03

Общее для всех модулей.

Ну т.е. нужно вручную следить за отсутствием коллизий типа

Самостоятельно

Поделиться