View source
<?php
namespace Drupal\config_split\EventSubscriber;
use Drupal\config_split\ConfigSplitManager;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\ImmutableConfig;
use Drupal\Core\Config\StorageTransformEvent;
use Drupal\Core\Site\Settings;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class SplitImportExportSubscriber implements EventSubscriberInterface {
protected $manager;
protected $configFactory;
public function __construct(ConfigSplitManager $manager, ConfigFactoryInterface $configFactory) {
$this->manager = $manager;
$this->configFactory = $configFactory;
}
public static function getSubscribedEvents() {
$splits = Settings::get('config_split_priorities', []);
$exportSubscriptions = [
[
'exportDefaultPriority',
0,
],
];
$importSubscriptions = [
[
'importDefaultPriority',
0,
],
];
foreach ($splits as $name => $priority) {
$exportSubscriptions[] = [
'_exportExplicit_' . $name,
$priority,
];
$importSubscriptions[] = [
'_importExplicit_' . $name,
-$priority,
];
}
return [
'config.transform.export' => $exportSubscriptions,
'config.transform.import' => $importSubscriptions,
];
}
public function exportDefaultPriority(StorageTransformEvent $event) {
foreach ($this
->getDefaultPrioritySplitConfigs() as $split) {
$this->manager
->exportTransform($split
->get('id'), $event);
}
}
public function importDefaultPriority(StorageTransformEvent $event) {
$splits = array_reverse($this
->getDefaultPrioritySplitConfigs());
foreach ($splits as $split) {
$this->manager
->importTransform($split
->get('id'), $event);
}
}
public function __call($name, $arguments) {
if (substr($name, 0, strlen('_exportExplicit_')) === '_exportExplicit_') {
$this->manager
->exportTransform(substr($name, strlen('_exportExplicit_')), $arguments[0]);
return;
}
if (substr($name, 0, strlen('_importExplicit_')) === '_importExplicit_') {
$this->manager
->importTransform(substr($name, strlen('_importExplicit_')), $arguments[0]);
return;
}
throw new \BadMethodCallException("No method {$name}");
}
protected function getDefaultPrioritySplitConfigs() : array {
$names = $this->configFactory
->listAll('config_split.config_split.');
$explicit = Settings::get('config_split_priorities', []);
if (is_array($explicit)) {
$explicit = array_map(function ($name) {
if (strpos($name, 'config_split.config_split.') !== 0) {
$name = 'config_split.config_split.' . $name;
}
return $name;
}, $explicit);
$names = array_diff($names, $explicit);
}
$splits = $this->configFactory
->loadMultiple($names);
uasort($splits, function (ImmutableConfig $a, ImmutableConfig $b) {
return $a
->get('weight') <=> $b
->get('weight');
});
return $splits;
}
}