Skip to content

Commit f32aaf1

Browse files
committed
Split $objectDefinition into $schema and $properties (jsonrainbow#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 jsonrainbow#353.
1 parent e3c9bcc commit f32aaf1

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
@@ -77,13 +77,15 @@ protected function checkArray(&$value, $schema = null, JsonPointer $path = null,
7777
* @param mixed $value
7878
* @param mixed $schema
7979
* @param JsonPointer|null $path
80-
* @param mixed $i
80+
* @param mixed $properties
81+
* @param mixed $additionalProperties
8182
* @param mixed $patternProperties
8283
*/
83-
protected function checkObject(&$value, $schema = null, JsonPointer $path = null, $i = null, $patternProperties = null, $appliedDefaults = array())
84+
protected function checkObject(&$value, $schema = null, JsonPointer $path = null, $properties = null,
85+
$additionalProperties = null, $patternProperties = null, $appliedDefaults = array())
8486
{
8587
$validator = $this->factory->createInstanceFor('object');
86-
$validator->check($value, $schema, $path, $i, $patternProperties, $appliedDefaults);
88+
$validator->check($value, $schema, $path, $properties, $additionalProperties, $patternProperties, $appliedDefaults);
8789

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

src/JsonSchema/Constraints/ObjectConstraint.php

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

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

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

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

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

9498
foreach ($element as $i => $value) {
95-
$definition = $this->getProperty($objectDefinition, $i);
99+
$definition = $this->getProperty($properties, $i);
96100

97101
// no additional properties allowed
98102
if (!in_array($i, $matches) && $additionalProp === false && $this->inlineSchemaProperty !== $i && !$definition) {
@@ -124,17 +128,17 @@ public function validateElement($element, $matches, $objectDefinition = null, Js
124128
/**
125129
* Validates the definition properties
126130
*
127-
* @param \stdClass $element Element to validate
128-
* @param \stdClass $objectDefinition ObjectConstraint definition
129-
* @param JsonPointer|null $path Path?
131+
* @param \stdClass $element Element to validate
132+
* @param \stdClass $properties Property definitions
133+
* @param JsonPointer|null $path Path?
130134
*/
131-
public function validateDefinition(&$element, $objectDefinition = null, JsonPointer $path = null)
135+
public function validateProperties(&$element, $properties = null, JsonPointer $path = null)
132136
{
133137
$undefinedConstraint = $this->factory->createInstanceFor('undefined');
134138

135-
foreach ($objectDefinition as $i => $value) {
139+
foreach ($properties as $i => $value) {
136140
$property = &$this->getProperty($element, $i, $undefinedConstraint);
137-
$definition = $this->getProperty($objectDefinition, $i);
141+
$definition = $this->getProperty($properties, $i);
138142

139143
if (is_object($definition)) {
140144
// 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
@@ -72,8 +72,9 @@ public function validateTypes(&$value, $schema = null, JsonPointer $path, $i = n
7272
// is not set (i.e. don't use $this->getTypeCheck() here).
7373
$this->checkObject(
7474
$value,
75-
isset($schema->properties) ? $this->factory->getSchemaStorage()->resolveRefSchema($schema->properties) : $schema,
75+
$schema,
7676
$path,
77+
isset($schema->properties) ? $schema->properties : null,
7778
isset($schema->additionalProperties) ? $schema->additionalProperties : null,
7879
isset($schema->patternProperties) ? $schema->patternProperties : null,
7980
$this->appliedDefaults

0 commit comments

Comments
 (0)