function SchemaCheckTrait::isViolationForIgnoredPropertyPath

Same name and namespace in other branches
  1. 11.x core/lib/Drupal/Core/Config/Schema/SchemaCheckTrait.php \Drupal\Core\Config\Schema\SchemaCheckTrait::isViolationForIgnoredPropertyPath()

Determines whether this violation is for an ignored Config property path.

Parameters

\Symfony\Component\Validator\ConstraintViolation $v: A validation constraint violation for a Config object.

Return value

bool

1 call to SchemaCheckTrait::isViolationForIgnoredPropertyPath()
SchemaCheckTrait::checkConfigSchema in core/lib/Drupal/Core/Config/Schema/SchemaCheckTrait.php
Checks the TypedConfigManager has a valid schema for the configuration.

File

core/lib/Drupal/Core/Config/Schema/SchemaCheckTrait.php, line 129

Class

SchemaCheckTrait
Provides a trait for checking configuration schema.

Namespace

Drupal\Core\Config\Schema

Code

protected static function isViolationForIgnoredPropertyPath(ConstraintViolation $v) : bool {
    // When the validated object is a config entity wrapped in a
    // ConfigEntityAdapter, some work is necessary to map from e.g.
    // `entity:comment_type` to the corresponding `comment.type.*`.
    if ($v->getRoot() instanceof ConfigEntityAdapter) {
        $config_entity = $v->getRoot()
            ->getEntity();
        assert($config_entity instanceof ConfigEntityInterface);
        $config_entity_type = $config_entity->getEntityType();
        assert($config_entity_type instanceof ConfigEntityType);
        $config_prefix = $config_entity_type->getConfigPrefix();
        // Compute the data type of the config object being validated:
        // - the config entity type's config prefix
        // - with as many `.*`-suffixes appended as there are parts in the ID (for
        //   example, for NodeType there's only 1 part, for EntityViewDisplay
        //   there are 3 parts.)
        // TRICKY: in principle it is possible to compute the exact number of
        // suffixes by inspecting ConfigEntity::getConfigDependencyName(), except
        // when the entity ID itself is invalid. Unfortunately that means
        // gradually discovering it is the only available alternative.
        $suffix_count = 1;
        do {
            $config_object_data_type = $config_prefix . str_repeat('.*', $suffix_count);
            $suffix_count++;
        } while ($suffix_count <= 3 && !array_key_exists($config_object_data_type, static::$ignoredPropertyPaths));
    }
    else {
        $config_object_data_type = $v->getRoot()
            ->getDataDefinition()
            ->getDataType();
    }
    if (!array_key_exists($config_object_data_type, static::$ignoredPropertyPaths)) {
        return FALSE;
    }
    foreach (static::$ignoredPropertyPaths[$config_object_data_type] as $ignored_property_path_expression => $ignored_validation_constraint_messages) {
        // Convert the wildcard-based expression to a regex: treat `*` nor in the
        // regex sense nor as something to be escaped: treat it as the wildcard
        // for a segment in a property path (property path segments are separated
        // by periods).
        // That requires first ensuring that preg_quote() does not escape it, and
        // then replacing it with an appropriate regular expression: `[^\.]+`,
        // which means: ">=1 characters that are anything except a period".
        $ignored_property_path_regex = str_replace(' ', '[^\\.]+', preg_quote(str_replace('*', ' ', $ignored_property_path_expression)));
        // To ignore this violation constraint, require a match on both the
        // property path and the message.
        $property_path_match = preg_match('/^' . $ignored_property_path_regex . '$/', $v->getPropertyPath(), $matches) === 1;
        if ($property_path_match) {
            return preg_match(sprintf("/^(%s)\$/", implode('|', $ignored_validation_constraint_messages)), (string) $v->getMessage()) === 1;
        }
    }
    return FALSE;
}

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