Я продвинулся на шаг вперед - есть способ использовать класс EntityTypeManager для создания / обновления конфигураций.
2 ссылки помогли мне в этом:
https://drupal.stackexchange.com/questions/164713/how-do-i-update-the-configuration-of-a-module
pwolanins ответ внизу предоставляет функцию, которая либо обновляет конфигурацию, если она существует, либо создает конфигурацию напрямую.
https://www.metaltoad.com/blog/programmatically-importing-drupal-8-field-configurations
код на этой странице дает более четкое представление о том, что происходит - для каждой конфигурации, которую вы хотите установить, вы запускаете файл YML через соответствующий менеджер хранилища, а затем создаете соответствующие конфигурации сущностей, которые создают все необходимых таблиц БД.
То, что я закончил, было:
Использовал слегка модифицированную версию кода pwolanins и создал общую функцию обновления конфигурации -
function _update_or_install_config( String $prefix, String $update_id, String $module) {
$updated = [];
$created = [];
/** @var \Drupal\Core\Config\ConfigManagerInterface $config_manager */
$config_manager = \Drupal::service('config.manager');
$files = glob(drupal_get_path('module', $module) . '/config/update_' . $update_id. '/' . $prefix . '*.yml') ;
foreach ($files as $file) {
$raw = file_get_contents($file);
$value = \Drupal\Component\Serialization\Yaml::decode($raw);
if(!is_array($value)) {
throw new \RuntimeException(sprintf('Invalid YAML file %s'), $file);
}
$type = $config_manager->getEntityTypeIdByName(basename($file));
$entity_manager = $config_manager->getEntityManager();
$definition = $entity_manager->getDefinition($type);
$id_key = $definition->getKey('id');
$id = $value[$id_key];
/** @var \Drupal\Core\Config\Entity\ConfigEntityStorage $entity_storage */
$entity_storage = $entity_manager->getStorage($type);
$entity = $entity_storage->load($id);
if ($entity) {
$entity = $entity_storage->updateFromStorageRecord($entity, $value);
$entity->save();
$updated[] = $id;
}
else {
$entity = $entity_storage->createFromStorageRecord($value);
$entity->save();
$created[] = $id;
}
}
return [
'udpated' => $updated,
'created' => $created,
];
}
Я поместил все свои yml
файлы в папку config/update_8002
, затем использовал эту функцию для циклического перебора файлов конфигурации в функции hook_update_N:
function MODULE_NAME_update_8002() {
$configs_to_install = [
'paragraphs.paragraphs_type.cbsf_file_download',
'core.entity_form_display.paragraph.cbsf_file_download.default',
'core.entity_view_display.paragraph.cbsf_file_download.default',
'field.storage.paragraph.field_cb_file',
'field.field.paragraph.cbsf_file_download.field_cb_file',
'field.field.paragraph.cbsf_file_download.field_cb_heading',
'field.field.paragraph.cbsf_file_download.field_cb_icon',
'field.field.paragraph.cbsf_file_download.field_cb_text',
];
foreach ($configs_to_install as $config_to_install) {
_update_or_install_config('paragraphs.paragraphs_type', '8002', 'MODULE_NAME');
_update_or_install_config('field.storage.paragraph', '8002', 'MODULE_NAME');
_update_or_install_config('field.field.paragraph', '8002', 'MODULE_NAME');
_update_or_install_config('core.entity_view_display.paragraph', '8002', 'MODULE_NAME');
_update_or_install_config('core.entity_form_display.paragraph', '8002', 'MODULE_NAME');
}
}
Обратите внимание, что функция _update_or_install_config
перебирает все конфиги в папке, которые соответствуют определенному менеджеру типов сущностей - таким образом, вы должны просто включить префикс в функцию и все файлы YML, которые импортируют конфигурацию того же самого тип будет включен.