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

Breadcrumb

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

function SchemaConstraint::check

Overrides ConstraintInterface::check

File

vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php, line 31

Class

SchemaConstraint
The SchemaConstraint Constraints, validates an element against a given schema

Namespace

JsonSchema\Constraints

Code

public function check(&$element, $schema = null, ?JsonPointer $path = null, $i = null) {
    if ($schema !== null) {
        // passed schema
        $validationSchema = $schema;
    }
    elseif ($this->getTypeCheck()
        ->propertyExists($element, $this->inlineSchemaProperty)) {
        // inline schema
        $validationSchema = $this->getTypeCheck()
            ->propertyGet($element, $this->inlineSchemaProperty);
    }
    else {
        throw new InvalidArgumentException('no schema found to verify against');
    }
    // cast array schemas to object
    if (is_array($validationSchema)) {
        $validationSchema = BaseConstraint::arrayToObjectRecursive($validationSchema);
    }
    // validate schema against whatever is defined in $validationSchema->$schema. If no
    // schema is defined, assume self::DEFAULT_SCHEMA_SPEC (currently draft-04).
    if ($this->factory
        ->getConfig(self::CHECK_MODE_VALIDATE_SCHEMA)) {
        if (!$this->getTypeCheck()
            ->isObject($validationSchema)) {
            throw new RuntimeException('Cannot validate the schema of a non-object');
        }
        if ($this->getTypeCheck()
            ->propertyExists($validationSchema, '$schema')) {
            $schemaSpec = $this->getTypeCheck()
                ->propertyGet($validationSchema, '$schema');
        }
        else {
            $schemaSpec = self::DEFAULT_SCHEMA_SPEC;
        }
        // get the spec schema
        $schemaStorage = $this->factory
            ->getSchemaStorage();
        if (!$this->getTypeCheck()
            ->isObject($schemaSpec)) {
            $schemaSpec = $schemaStorage->getSchema($schemaSpec);
        }
        // save error count, config & subtract CHECK_MODE_VALIDATE_SCHEMA
        $initialErrorCount = $this->numErrors();
        $initialConfig = $this->factory
            ->getConfig();
        $initialContext = $this->factory
            ->getErrorContext();
        $this->factory
            ->removeConfig(self::CHECK_MODE_VALIDATE_SCHEMA | self::CHECK_MODE_APPLY_DEFAULTS);
        $this->factory
            ->addConfig(self::CHECK_MODE_TYPE_CAST);
        $this->factory
            ->setErrorContext(Validator::ERROR_SCHEMA_VALIDATION);
        // validate schema
        try {
            $this->check($validationSchema, $schemaSpec);
        } catch (\Exception $e) {
            if ($this->factory
                ->getConfig(self::CHECK_MODE_EXCEPTIONS)) {
                throw new InvalidSchemaException('Schema did not pass validation', 0, $e);
            }
        }
        if ($this->numErrors() > $initialErrorCount) {
            $this->addError($path, 'Schema is not valid', 'schema');
        }
        // restore the initial config
        $this->factory
            ->setConfig($initialConfig);
        $this->factory
            ->setErrorContext($initialContext);
    }
    // validate element against $validationSchema
    $this->checkUndefined($element, $validationSchema, $path, $i);
}
RSS feed
Powered by Drupal