Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. ConfigSchemaChecker.php

class ConfigSchemaChecker

Listens to the config save event and validates schema.

If tests have the $strictConfigSchema property set to TRUE this event listener will be added to the container and throw exceptions if configuration is invalid.

Hierarchy

  • class \Drupal\Core\Config\Development\ConfigSchemaChecker implements \Symfony\Component\EventDispatcher\EventSubscriberInterface uses \Drupal\Core\Config\Schema\SchemaCheckTrait

Expanded class hierarchy of ConfigSchemaChecker

See also

\Drupal\KernelTests\KernelTestBase::register()

\Drupal\Core\Test\FunctionalTestSetupTrait::prepareSettings()

1 file declares its use of ConfigSchemaChecker
FunctionalTestSetupTrait.php in core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php

File

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

Namespace

Drupal\Core\Config\Development
View source
class ConfigSchemaChecker implements EventSubscriberInterface {
    use SchemaCheckTrait;
    
    /**
     * The typed config manger.
     *
     * @var \Drupal\Core\Config\TypedConfigManagerInterface
     */
    protected $typedManager;
    
    /**
     * An array of config checked already. Keyed by config name and a checksum.
     *
     * @var array
     */
    protected $checked = [];
    
    /**
     * An array of config object names that are excluded from schema checking.
     *
     * @var string[]
     */
    protected $exclude = [];
    
    /**
     * Constructs the ConfigSchemaChecker object.
     *
     * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_manager
     *   The typed config manager.
     * @param string[] $exclude
     *   An array of config object names that are excluded from schema checking.
     * @param bool $validateConstraints
     *   Determines if constraints will be validated. If TRUE, constraint
     *   validation errors will be added to the errors found by
     *   SchemaCheckTrait::checkConfigSchema().
     */
    public function __construct(TypedConfigManagerInterface $typed_manager, array $exclude = [], bool $validateConstraints = FALSE) {
        $this->typedManager = $typed_manager;
        $this->exclude = $exclude;
    }
    
    /**
     * Checks that configuration complies with its schema on config save.
     *
     * @param \Drupal\Core\Config\ConfigCrudEvent $event
     *   The configuration event.
     *
     * @throws \Drupal\Core\Config\Schema\SchemaIncompleteException
     *   Exception thrown when configuration does not match its schema.
     */
    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, $this->validateConstraints);
            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));
            }
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents() : array {
        $events[ConfigEvents::SAVE][] = [
            'onConfigSave',
            255,
        ];
        return $events;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ConfigSchemaChecker::$checked protected property An array of config checked already. Keyed by config name and a checksum.
ConfigSchemaChecker::$exclude protected property An array of config object names that are excluded from schema checking.
ConfigSchemaChecker::$typedManager protected property The typed config manger.
ConfigSchemaChecker::getSubscribedEvents public static function Returns an array of event names this subscriber wants to listen to. Overrides EventSubscriberInterface::getSubscribedEvents
ConfigSchemaChecker::onConfigSave public function Checks that configuration complies with its schema on config save.
ConfigSchemaChecker::__construct public function Constructs the ConfigSchemaChecker object.
SchemaCheckTrait::$configName protected property The configuration object name under test.
SchemaCheckTrait::$ignoredPropertyPaths protected static property The ignored property paths.
SchemaCheckTrait::$schema protected property The config schema wrapper object for the configuration object under test.
SchemaCheckTrait::checkConfigSchema public function Checks the TypedConfigManager has a valid schema for the configuration.
SchemaCheckTrait::checkValue protected function Helper method to check data type.
SchemaCheckTrait::isViolationForIgnoredPropertyPath protected static function Determines whether this violation is for an ignored Config property path.

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal