diff --git a/CHANGELOG.md b/CHANGELOG.md index 2365ad9c..40c06e51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgrade php cs fixer to latest ([#783](https://github.com/jsonrainbow/json-schema/pull/783)) - Create deep copy before checking each sub schema in oneOf ([#791](https://github.com/jsonrainbow/json-schema/pull/791)) - Create deep copy before checking each sub schema in anyOf ([#792](https://github.com/jsonrainbow/json-schema/pull/792)) +- Correctly set the schema ID when passing it as assoc array ([#794](https://github.com/jsonrainbow/json-schema/pull/794)) ### Changed - Used PHPStan's int-mask-of type where applicable ([#779](https://github.com/jsonrainbow/json-schema/pull/779)) diff --git a/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php b/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php index 18057512..8f9f349b 100644 --- a/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php +++ b/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php @@ -44,7 +44,7 @@ public static function propertyExists($value, $property) return property_exists($value, $property); } - return array_key_exists($property, $value); + return is_array($value) && array_key_exists($property, $value); } public static function propertyCount($value) diff --git a/src/JsonSchema/Validator.php b/src/JsonSchema/Validator.php index a02c2e5d..bf172640 100644 --- a/src/JsonSchema/Validator.php +++ b/src/JsonSchema/Validator.php @@ -13,6 +13,7 @@ use JsonSchema\Constraints\BaseConstraint; use JsonSchema\Constraints\Constraint; +use JsonSchema\Constraints\TypeCheck\LooseTypeCheck; /** * A JsonSchema Constraint @@ -59,10 +60,9 @@ public function validate(&$value, $schema = null, $checkMode = null) } // add provided schema to SchemaStorage with internal URI to allow internal $ref resolution - if (is_object($schema) && property_exists($schema, 'id')) { - $schemaURI = $schema->id; - } else { - $schemaURI = SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI; + $schemaURI = SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI; + if (LooseTypeCheck::propertyExists($schema, 'id')) { + $schemaURI = LooseTypeCheck::propertyGet($schema, 'id'); } $this->factory->getSchemaStorage()->addSchema($schemaURI, $schema); diff --git a/tests/ValidatorTest.php b/tests/ValidatorTest.php index 26a8069d..9f536384 100644 --- a/tests/ValidatorTest.php +++ b/tests/ValidatorTest.php @@ -18,6 +18,17 @@ public function testValidateWithAssocSchema(): void $this->assertFalse($validator->isValid(), 'Validation succeeded, but should have failed.'); } + public function testValidateWithAssocSchemaWithRelativeRefs(): void + { + $schema = json_decode(file_get_contents(__DIR__ . '/fixtures/relative.json'), true); + $data = json_decode('{"foo":{"foo": "bar"}}', false); + + $validator = new Validator(); + $validator->validate($data, $schema); + + $this->assertTrue($validator->isValid(), 'Validation failed, but should have succeeded.'); + } + public function testBadAssocSchemaInput(): void { if (version_compare(phpversion(), '5.5.0', '<')) { diff --git a/tests/fixtures/relative.json b/tests/fixtures/relative.json new file mode 100644 index 00000000..f07531b2 --- /dev/null +++ b/tests/fixtures/relative.json @@ -0,0 +1,11 @@ +{ + "id": "tests/fixtures/relative.json", + "type": "object", + "properties": { + "foo": { + "$ref": "foobar.json" + } + }, + "required": ["foo"], + "additionalProperties": false +}