function ComponentPluginManager::alterDefinitions

Same name in this branch
  1. 11.x core/modules/sdc/src/ComponentPluginManager.php \Drupal\sdc\ComponentPluginManager::alterDefinitions()
Same name and namespace in other branches
  1. 10 core/modules/sdc/src/ComponentPluginManager.php \Drupal\sdc\ComponentPluginManager::alterDefinitions()

Overrides DefaultPluginManager::alterDefinitions

File

core/lib/Drupal/Core/Theme/ComponentPluginManager.php, line 238

Class

ComponentPluginManager
Defines a plugin manager to deal with components.

Namespace

Drupal\Core\Theme

Code

protected function alterDefinitions(&$definitions) {
    // Save in the definition whether this is a module or a theme. This is
    // important because when creating the plugin instance (the Component
    // object) we'll need to negotiate based on the active theme.
    $definitions = array_map([
        $this,
        'alterDefinition',
    ], $definitions);
    // Validate the definition after alterations.
    assert(Inspector::assertAll(fn(array $definition) => $this->isValidDefinition($definition), $definitions));
    parent::alterDefinitions($definitions);
    // Finally, validate replacements.
    $replacing_definitions = array_filter($definitions, static fn(array $definition) => ($definition['replaces'] ?? NULL) && ($definitions[$definition['replaces']] ?? NULL));
    $validation_errors = array_reduce($replacing_definitions, function (array $errors, array $new_definition) use ($definitions) {
        $original_definition = $definitions[$new_definition['replaces']];
        $original_schemas = $original_definition['props'] ?? NULL;
        $new_schemas = $new_definition['props'] ?? NULL;
        if (!$original_schemas || !$new_schemas) {
            return [
                sprintf("Component \"%s\" is attempting to replace \"%s\", however component replacement requires both components to have schema definitions.", $new_definition['id'], $original_definition['id']),
            ];
        }
        try {
            $this->compatibilityChecker
                ->isCompatible($original_schemas, $new_schemas);
        } catch (IncompatibleComponentSchema $e) {
            $errors[] = sprintf("\"%s\" is incompatible with the component is wants to replace \"%s\". Errors:\n%s", $new_definition['id'], $original_definition['id'], $e->getMessage());
        }
        return $errors;
    }, []);
    if (!empty($validation_errors)) {
        throw new IncompatibleComponentSchema(implode("\n", $validation_errors));
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.