You are here

public function ConfigSchemaChecker::onConfigSave in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/lib/Drupal/Core/Config/Testing/ConfigSchemaChecker.php \Drupal\Core\Config\Testing\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/Testing/ConfigSchemaChecker.php, line 75
Contains \Drupal\Core\Config\Testing\ConfigSchemaChecker.

Class

ConfigSchemaChecker
Listens to the config save event and validates schema.

Namespace

Drupal\Core\Config\Testing

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 = hash('crc32b', 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[] = SafeMarkup::format('@key @error', array(
          '@key' => $key,
          '@error' => $error,
        ));
      }
      throw new SchemaIncompleteException("Schema errors for {$name} with the following errors: " . implode(', ', $text_errors));
    }
  }
}