Skip to content

Commit

Permalink
[BUGFIX] Cast empty schema arrays to object (#409)
Browse files Browse the repository at this point in the history
* Cast root to object

* Use function_exists to allow polyfill compatibility

* Move array->object conversion to SchemaConstraint & SchemaStorage

Fixes issue #408
  • Loading branch information
erayd authored and bighappyface committed May 5, 2017
1 parent d7fcdcb commit 549b4af
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 13 deletions.
4 changes: 2 additions & 2 deletions src/JsonSchema/Constraints/BaseConstraint.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,12 @@ public static function arrayToObjectRecursive($array)
$json = json_encode($array);
if (json_last_error() !== \JSON_ERROR_NONE) {
$message = 'Unable to encode schema array as JSON';
if (version_compare(phpversion(), '5.5.0', '>=')) {
if (function_exists('json_last_error_msg')) {
$message .= ': ' . json_last_error_msg();
}
throw new InvalidArgumentException($message);
}

return json_decode($json);
return (object) json_decode($json);
}
}
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 549b4af

Please sign in to comment.