Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Importing Drupal 8 config programmatically
<?php
// Import arbitrary config from a variable.
// Assumes $data has the data you want to import for this config.
$config = \Drupal::service('config.factory')->getEditable('filter.format.basic_html');
$config->setData($data)->save();
// Or, re-import the default config for a module or profile, etc.
\Drupal::service('config.installer')->installDefaultConfig('module', 'my_custom_module');
// Or, import YAML config from an arbitrary file.
$config_path = drupal_get_path('module', 'my_custom_module') . '/config/install';
$source = new FileStorage($config_path);
$config_storage = \Drupal::service('config.storage');
$config_storage->write('filter.format.basic_html', $source->read('filter.format.basic_html'));
@sumanchalki

This comment has been minimized.

Copy link

sumanchalki commented Jun 7, 2018

Good one.

@dlriley

This comment has been minimized.

Copy link

dlriley commented Oct 24, 2018

Huge thanks - saved a lot of time!

@JPustkuchen

This comment has been minimized.

Copy link

JPustkuchen commented Jun 11, 2019

Very helpful, thank you!

You may also like this to install optional config e.g. in an update hook:

  $config_path = drupal_get_path('module', 'MY_MODULE') . '/config/optional';
  $config_source      = new \Drupal\Core\Config\FileStorage($config_path);
  \Drupal::service('config.installer')->installOptionalConfig($config_source);
@golddragon007

This comment has been minimized.

Copy link

golddragon007 commented Sep 25, 2019

If you want to import all the site configs (drush required):

  /* @var \Drush\Drupal\Commands\config\ConfigImportCommands $drush_import */
  $container = \Drupal::getContainer();
  $drush_import = $container->get('config.import.commands');
  $storage_comparer = new StorageComparer(
    $container->get('config.storage.sync'),
    $container->get('config.storage')
  );
  $storage_comparer->createChangelist();
  $drush_import->doImport($storage_comparer);
@ojacquet

This comment has been minimized.

Copy link

ojacquet commented May 14, 2020

The first example does not work if you want to import new field storage definitions. This is what I've come up with:

$storage_comparer = new StorageComparer(
  \Drupal::service('config.storage.sync'),
  \Drupal::service('config.storage'),
  \Drupal::service('config.manager')
);
$config_importer = new ConfigImporter(
  $storage_comparer,
  \Drupal::service('event_dispatcher'),
  \Drupal::service('config.manager'),
  \Drupal::lock(),
  \Drupal::service('config.typed'),
  \Drupal::moduleHandler(),
  \Drupal::service('module_installer'),
  \Drupal::service('theme_handler'),
  \Drupal::service('string_translation')
);
$collection = StorageInterface::DEFAULT_COLLECTION;
$method = new ReflectionMethod($config_importer, 'processConfiguration');
$method->setAccessible(TRUE);
$method->invoke($config_importer, $collection, 'create', 'field.storage.node.field_subject');
$method->invoke($config_importer, $collection, 'create', 'field.field.node.mail.field_subject');
$context = [];
$config_importer->doSyncStep('finish', $context);

So, if you want to create fields it might be easier to just use Field(Storage)Config::create

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.