Skip to content

Commit 7ec8f1b

Browse files
eraydbighappyface
authored andcommitted
Split $objectDefinition into $schema and $properties (#411)
Object validation attempts to use a single variable to store both the object definition, and its properties. This causes validation to be incomplete where "properties" is not set, but "additionalProperties" is. This commit fixes both bugs in issue #353.
1 parent 2553ebd commit 7ec8f1b

File tree

3 files changed

+31
-24
lines changed

3 files changed

+31
-24
lines changed

src/JsonSchema/Constraints/Constraint.php

+5-3
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ protected function checkArray(&$value, $schema = null, JsonPointer $path = null,
7878
* @param mixed $value
7979
* @param mixed $schema
8080
* @param JsonPointer|null $path
81-
* @param mixed $i
81+
* @param mixed $properties
82+
* @param mixed $additionalProperties
8283
* @param mixed $patternProperties
8384
*/
84-
protected function checkObject(&$value, $schema = null, JsonPointer $path = null, $i = null, $patternProperties = null, $appliedDefaults = array())
85+
protected function checkObject(&$value, $schema = null, JsonPointer $path = null, $properties = null,
86+
$additionalProperties = null, $patternProperties = null, $appliedDefaults = array())
8587
{
8688
$validator = $this->factory->createInstanceFor('object');
87-
$validator->check($value, $schema, $path, $i, $patternProperties, $appliedDefaults);
89+
$validator->check($value, $schema, $path, $properties, $additionalProperties, $patternProperties, $appliedDefaults);
8890

8991
$this->addErrors($validator->getErrors());
9092
}

src/JsonSchema/Constraints/ObjectConstraint.php

+24-20
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class ObjectConstraint extends Constraint
2828
/**
2929
* {@inheritdoc}
3030
*/
31-
public function check(&$element, $definition = null, JsonPointer $path = null, $additionalProp = null, $patternProperties = null, $appliedDefaults = array())
31+
public function check(&$element, $schema = null, JsonPointer $path = null, $properties = null,
32+
$additionalProp = null, $patternProperties = null, $appliedDefaults = array())
3233
{
3334
if ($element instanceof UndefinedConstraint) {
3435
return;
@@ -38,16 +39,17 @@ public function check(&$element, $definition = null, JsonPointer $path = null, $
3839

3940
$matches = array();
4041
if ($patternProperties) {
42+
// validate the element pattern properties
4143
$matches = $this->validatePatternProperties($element, $path, $patternProperties);
4244
}
4345

44-
if ($definition) {
45-
// validate the definition properties
46-
$this->validateDefinition($element, $definition, $path);
46+
if ($properties) {
47+
// validate the element properties
48+
$this->validateProperties($element, $properties, $path);
4749
}
4850

49-
// additional the element properties
50-
$this->validateElement($element, $matches, $definition, $path, $additionalProp);
51+
// validate additional element properties & constraints
52+
$this->validateElement($element, $matches, $schema, $path, $properties, $additionalProp);
5153
}
5254

5355
public function validatePatternProperties($element, JsonPointer $path = null, $patternProperties)
@@ -82,18 +84,20 @@ public function validatePatternProperties($element, JsonPointer $path = null, $p
8284
/**
8385
* Validates the element properties
8486
*
85-
* @param \stdClass $element Element to validate
86-
* @param array $matches Matches from patternProperties (if any)
87-
* @param \stdClass $objectDefinition ObjectConstraint definition
88-
* @param JsonPointer|null $path Path to test?
89-
* @param mixed $additionalProp Additional properties
87+
* @param \StdClass $element Element to validate
88+
* @param array $matches Matches from patternProperties (if any)
89+
* @param \StdClass $schema ObjectConstraint definition
90+
* @param JsonPointer|null $path Current test path
91+
* @param \StdClass $properties Properties
92+
* @param mixed $additionalProp Additional properties
9093
*/
91-
public function validateElement($element, $matches, $objectDefinition = null, JsonPointer $path = null, $additionalProp = null)
94+
public function validateElement($element, $matches, $schema = null, JsonPointer $path = null,
95+
$properties = null, $additionalProp = null)
9296
{
93-
$this->validateMinMaxConstraint($element, $objectDefinition, $path);
97+
$this->validateMinMaxConstraint($element, $schema, $path);
9498

9599
foreach ($element as $i => $value) {
96-
$definition = $this->getProperty($objectDefinition, $i);
100+
$definition = $this->getProperty($properties, $i);
97101

98102
// no additional properties allowed
99103
if (!in_array($i, $matches) && $additionalProp === false && $this->inlineSchemaProperty !== $i && !$definition) {
@@ -128,17 +132,17 @@ public function validateElement($element, $matches, $objectDefinition = null, Js
128132
/**
129133
* Validates the definition properties
130134
*
131-
* @param \stdClass $element Element to validate
132-
* @param \stdClass $objectDefinition ObjectConstraint definition
133-
* @param JsonPointer|null $path Path?
135+
* @param \stdClass $element Element to validate
136+
* @param \stdClass $properties Property definitions
137+
* @param JsonPointer|null $path Path?
134138
*/
135-
public function validateDefinition(&$element, $objectDefinition = null, JsonPointer $path = null)
139+
public function validateProperties(&$element, $properties = null, JsonPointer $path = null)
136140
{
137141
$undefinedConstraint = $this->factory->createInstanceFor('undefined');
138142

139-
foreach ($objectDefinition as $i => $value) {
143+
foreach ($properties as $i => $value) {
140144
$property = &$this->getProperty($element, $i, $undefinedConstraint);
141-
$definition = $this->getProperty($objectDefinition, $i);
145+
$definition = $this->getProperty($properties, $i);
142146

143147
if (is_object($definition)) {
144148
// Undefined constraint will check for is_object() and quit if is not - so why pass it?

src/JsonSchema/Constraints/UndefinedConstraint.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ public function validateTypes(&$value, $schema = null, JsonPointer $path, $i = n
7373
// is not set (i.e. don't use $this->getTypeCheck() here).
7474
$this->checkObject(
7575
$value,
76-
isset($schema->properties) ? $this->factory->getSchemaStorage()->resolveRefSchema($schema->properties) : $schema,
76+
$schema,
7777
$path,
78+
isset($schema->properties) ? $schema->properties : null,
7879
isset($schema->additionalProperties) ? $schema->additionalProperties : null,
7980
isset($schema->patternProperties) ? $schema->patternProperties : null,
8081
$this->appliedDefaults

0 commit comments

Comments
 (0)