You are here

public function ConfigSchemaChecker::onConfigSave in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Config/Development/ConfigSchemaChecker.php \Drupal\Core\Config\Development\ConfigSchemaChecker::onConfigSave()

Checks that configuration complies with its schema on config save.

Parameters

\Drupal\Core\Config\ConfigCrudEvent $event: The configuration event.

Throws

\Drupal\Core\Config\Schema\SchemaIncompleteException Exception thrown when configuration does not match its schema.

File

core/lib/Drupal/Core/Config/Development/ConfigSchemaChecker.php, line 71

Class

ConfigSchemaChecker
Listens to the config save event and validates schema.

Namespace

Drupal\Core\Config\Development

Code

public function onConfigSave(ConfigCrudEvent $event) {

  // Only validate configuration if in the default collection. Other
  // collections may have incomplete configuration (for example language
  // overrides only). These are not valid in themselves.
  $saved_config = $event
    ->getConfig();
  if ($saved_config
    ->getStorage()
    ->getCollectionName() != StorageInterface::DEFAULT_COLLECTION) {
    return;
  }
  $name = $saved_config
    ->getName();
  $data = $saved_config
    ->get();
  $checksum = Crypt::hashBase64(serialize($data));
  if (!in_array($name, $this->exclude) && !isset($this->checked[$name . ':' . $checksum])) {
    $this->checked[$name . ':' . $checksum] = TRUE;
    $errors = $this
      ->checkConfigSchema($this->typedManager, $name, $data);
    if ($errors === FALSE) {
      throw new SchemaIncompleteException("No schema for {$name}");
    }
    elseif (is_array($errors)) {
      $text_errors = [];
      foreach ($errors as $key => $error) {
        $text_errors[] = new FormattableMarkup('@key @error', [
          '@key' => $key,
          '@error' => $error,
        ]);
      }
      throw new SchemaIncompleteException("Schema errors for {$name} with the following errors: " . implode(', ', $text_errors));
    }
  }
}