Skip to content

Commit

Permalink
Move array->object conversion to SchemaConstraint & SchemaStorage
Browse files Browse the repository at this point in the history
Fixes issue jsonrainbow#408
  • Loading branch information
erayd committed Apr 5, 2017
1 parent d2c0bab commit edb168a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 11 deletions.
11 changes: 6 additions & 5 deletions src/JsonSchema/Constraints/SchemaConstraint.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,17 @@ public function check(&$element, $schema = null, JsonPointer $path = null, $i =
// passed schema
$validationSchema = $schema;
} elseif ($this->getTypeCheck()->propertyExists($element, $this->inlineSchemaProperty)) {
$inlineSchema = $this->getTypeCheck()->propertyGet($element, $this->inlineSchemaProperty);
if (is_array($inlineSchema)) {
$inlineSchema = json_decode(json_encode($inlineSchema));
}
// inline schema
$validationSchema = $inlineSchema;
$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)) {
Expand Down
7 changes: 7 additions & 0 deletions src/JsonSchema/SchemaStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace JsonSchema;

use JsonSchema\Constraints\BaseConstraint;
use JsonSchema\Entity\JsonPointer;
use JsonSchema\Exception\UnresolvableJsonPointerException;
use JsonSchema\Iterator\ObjectIterator;
Expand Down Expand Up @@ -51,6 +52,12 @@ public function addSchema($id, $schema = null)
// schemas do not have an associated URI when passed via Validator::validate().
$schema = $this->uriRetriever->retrieve($id);
}

// cast array schemas to object
if (is_array($schema)) {
$schema = BaseConstraint::arrayToObjectRecursive($schema);
}

$objectIterator = new ObjectIterator($schema);
foreach ($objectIterator as $toResolveSchema) {
if (property_exists($toResolveSchema, '$ref') && is_string($toResolveSchema->{'$ref'})) {
Expand Down
10 changes: 4 additions & 6 deletions src/JsonSchema/Validator.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,6 @@ public function validate(&$value, $schema = null, $checkMode = null)
// reset errors prior to validation
$this->reset();

// make sure $schema is an object
if (is_array($schema)) {
$schema = self::arrayToObjectRecursive($schema);
}

// set checkMode
$initialCheckMode = $this->factory->getConfig();
if ($checkMode !== null) {
Expand All @@ -60,7 +55,10 @@ public function validate(&$value, $schema = null, $checkMode = null)
$this->factory->getSchemaStorage()->addSchema(SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI, $schema);

$validator = $this->factory->createInstanceFor('schema');
$validator->check($value, $schema);
$validator->check(
$value,
$this->factory->getSchemaStorage()->getSchema(SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI)
);

$this->factory->setConfig($initialCheckMode);

Expand Down

0 comments on commit edb168a

Please sign in to comment.