class SchemaConstraint
The SchemaConstraint Constraints, validates an element against a given schema
@author Robert Schönthal <seroscho@googlemail.com> @author Bruno Prieto Reis <bruno.p.reis@gmail.com>
Hierarchy
- class \JsonSchema\Constraints\BaseConstraint
- class \JsonSchema\Constraints\Constraint extends \JsonSchema\Constraints\BaseConstraint implements \JsonSchema\Constraints\ConstraintInterface
- class \JsonSchema\Constraints\SchemaConstraint extends \JsonSchema\Constraints\Constraint
- class \JsonSchema\Constraints\Constraint extends \JsonSchema\Constraints\BaseConstraint implements \JsonSchema\Constraints\ConstraintInterface
Expanded class hierarchy of SchemaConstraint
File
-
vendor/
justinrainbow/ json-schema/ src/ JsonSchema/ Constraints/ SchemaConstraint.php, line 24
Namespace
JsonSchema\ConstraintsView source
class SchemaConstraint extends Constraint {
const DEFAULT_SCHEMA_SPEC = 'http://json-schema.org/draft-04/schema#';
/**
* {@inheritdoc}
*/
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);
}
}