Рубрики
Uncategorized

Drupal 8 — Различия между API конфигурации и API состояния

Прежде чем перейти к основной теме, имейте в виду, что эта статья была впервые написана для блога… Помеченный php, drupal.

Прежде чем перейти к основной теме, имейте в виду, что эта статья была впервые написана для блога веб—агентства Antistatique в Лозанне, Швейцария. Место, где я работаю веб-разработчиком полного стека.

Не стесняйтесь прочитать это здесь или проверить там: https://antistatique.net/en/we/blog/2016/06/14/drupal-8-differences-between-configuration-api-state-api

Извлеките весь код из моей сути: https://gist.github.com/Sudei/822510d2a069331a4bbe84ef55570705

Приятного чтения.

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

То, что я сделал, было очень просто понять:

  1. Клиент изменяет свою конфигурацию на веб-сайте, например, ключ API Монитора кампании,
  2. Я создаю новую функцию, запускаю ее в производство и использую команду drush cex для экспорта всей конфигурации в среду разработки,
  3. Я использую команду drush cim для импорта конфигурации в мою производственную среду,
  4. Веб-сайт теперь содержит конфигурацию моих сред разработки, потому что каждая конфигурация экспортируется/импортируется с помощью API конфигурации.

Решением было бы использовать ту же конфигурацию в производственных средах и средах разработки. Но в нашем случае это невозможно, мы должны синхронизировать локальную базу данных с производственной — это противоречит производительности.

В былые времена с Drupal 7 я использовал:

$data = variable_set('test.content_types'. 'value');

и перенесите это на Drupal 8, используя:

\Drupal::config('test')->set('content_types', 'value');

Это прекрасно, и это работает но позже, когда я запускаю импорт конфигурации drush drush cim на своем производственном сервере, он стирает (сбрасывает) конкретную конфигурацию моего производственного сервера.

Конфигурация – это место для хранения информации , которую вы хотите синхронизировать от разработки к производству . Эта информация часто создается во время создания сайта и обычно не создается обычными пользователями во время нормальной работы сайта.

Вы должны использовать API состояния , а не API конфигурации, для хранения локальных переменных, которые не должны перемещаться между экземплярами.

Типичное использование государственного API

Получить значение:

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

Получить несколько пар ключ/значение:

$pairs = \Drupal::state()->getMultiple($keys);

Установите значение:

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

Установите несколько значений:

\Drupal::state()->setMultiple($keyvalues);

Удалить значение:

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

Типичное использование API конфигурации

Извлекать конфигурацию только для чтения:

$config = \Drupal::config('mymodule.foo');

Получить значение:

$val = $config->get('key');

Объект конфигурации, который был получен и использован в предыдущих примерах, не позволяет изменять конфигурацию. Если вы хотите изменить конфигурацию, вместо этого вам нужно будет получить объект конфигурации, выполнив вызов getEditable() на фабрике конфигурации:

$config =\Drupal::service('config.factory')->getEditable('mymodule.foo');

Установите значение:

$config->set('enabled', 1);
// Save the configuration
$config->save();

Удалить значение:

$config->clear('bar.boo')->save();

API состояния предоставляет разработчикам место для хранения информации о состоянии системы.

Информация о состоянии отличается от конфигурации следующими способами:

  • Это специфично для конкретной среды.
  • Вы никогда не будете развертывать его для развертывания в разных средах.
  • Вы можете сбросить систему, потеряв все состояние. Его конфигурация остается неизменной.

Мы безуспешно пробуем множество других решений:

  • Использование флагов --пропустить-модуль или --частичный из драш цим
  • Подключение события, такого как configevents::УДАЛИТЬ и $событие->Остановка распространения();

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

А ты что думаешь?

Оригинал: “https://dev.to/wengerk/drupal-8-differences-between-configuration-api-state-api-4g31”