Прежде чем перейти к основной теме, имейте в виду, что эта статья была впервые написана для блога веб—агентства Antistatique в Лозанне, Швейцария. Место, где я работаю веб-разработчиком полного стека.
Не стесняйтесь прочитать это здесь или проверить там: https://antistatique.net/en/we/blog/2016/06/14/drupal-8-differences-between-configuration-api-state-api
Извлеките весь код из моей сути: https://gist.github.com/Sudei/822510d2a069331a4bbe84ef55570705
Приятного чтения.
На днях я столкнулся с серьезной проблемой. При импорте конфигурации в мою производственную среду. все файлы конфигурации, сохраненные для моего модуля, были переопределены конфигурацией в моих средах разработки.
То, что я сделал, было очень просто понять:
- Клиент изменяет свою конфигурацию на веб-сайте, например, ключ API Монитора кампании,
- Я создаю новую функцию, запускаю ее в производство и использую команду drush cex для экспорта всей конфигурации в среду разработки,
- Я использую команду drush cim для импорта конфигурации в мою производственную среду,
- Веб-сайт теперь содержит конфигурацию моих сред разработки, потому что каждая конфигурация экспортируется/импортируется с помощью 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.
А ты что думаешь?
- Drupal 7 – Набор переменных
- Drupal 7 – Переменная get
- Drupal 8 – API сайта
- Drupal 8 – API конфигурации
Оригинал: “https://dev.to/wengerk/drupal-8-differences-between-configuration-api-state-api-4g31”