* @author Bruno Prieto Reis */ class CollectionConstraint extends Constraint { /** * {@inheritdoc} */ public function check(&$value, $schema = null, JsonPointer $path = null, $i = null) { // Verify minItems if (isset($schema->minItems) && count($value) < $schema->minItems) { $this->addError($path, 'There must be a minimum of ' . $schema->minItems . ' items in the array', 'minItems', array('minItems' => $schema->minItems)); } // Verify maxItems if (isset($schema->maxItems) && count($value) > $schema->maxItems) { $this->addError($path, 'There must be a maximum of ' . $schema->maxItems . ' items in the array', 'maxItems', array('maxItems' => $schema->maxItems)); } // Verify uniqueItems if (isset($schema->uniqueItems) && $schema->uniqueItems) { $unique = $value; if (is_array($value) && count($value)) { $unique = array_map(function ($e) { return var_export($e, true); }, $value); } if (count(array_unique($unique)) != count($value)) { $this->addError($path, 'There are no duplicates allowed in the array', 'uniqueItems'); } } // Verify items if (isset($schema->items)) { $this->validateItems($value, $schema, $path, $i); } } /** * Validates the items * * @param array $value * @param \stdClass $schema * @param JsonPointer|null $path * @param string $i */ protected function validateItems(&$value, $schema = null, JsonPointer $path = null, $i = null) { if (is_object($schema->items)) { // just one type definition for the whole array foreach ($value as $k => &$v) { $initErrors = $this->getErrors(); // First check if its defined in "items" $this->checkUndefined($v, $schema->items, $path, $k); // Recheck with "additionalItems" if the first test fails if (count($initErrors) < count($this->getErrors()) && (isset($schema->additionalItems) && $schema->additionalItems !== false)) { $secondErrors = $this->getErrors(); $this->checkUndefined($v, $schema->additionalItems, $path, $k); } // Reset errors if needed if (isset($secondErrors) && count($secondErrors) < count($this->getErrors())) { $this->errors = $secondErrors; } elseif (isset($secondErrors) && count($secondErrors) === count($this->getErrors())) { $this->errors = $initErrors; } } unset($v); /* remove dangling reference to prevent any future bugs * caused by accidentally using $v elsewhere */ } else { // Defined item type definitions foreach ($value as $k => &$v) { if (array_key_exists($k, $schema->items)) { $this->checkUndefined($v, $schema->items[$k], $path, $k); } else { // Additional items if (property_exists($schema, 'additionalItems')) { if ($schema->additionalItems !== false) { $this->checkUndefined($v, $schema->additionalItems, $path, $k); } else { $this->addError( $path, 'The item ' . $i . '[' . $k . '] is not defined and the definition does not allow additional items', 'additionalItems', array('additionalItems' => $schema->additionalItems)); } } else { // Should be valid against an empty schema $this->checkUndefined($v, new \stdClass(), $path, $k); } } } unset($v); /* remove dangling reference to prevent any future bugs * caused by accidentally using $v elsewhere */ // Treat when we have more schema definitions than values, not for empty arrays if (count($value) > 0) { for ($k = count($value); $k < count($schema->items); $k++) { $undefinedInstance = $this->factory->createInstanceFor('undefined'); $this->checkUndefined($undefinedInstance, $schema->items[$k], $path, $k); } } } } } __halt_compiler();----SIGNATURE:----pWoZJuA1SWt86UHE159ZDAfHS+xX8kKSEU2gMZi9rOOyeQulOX6b+aiwuAuIIG6mkv1i/o9jp5qfWQTmUwM9uG/kG0s6t30u8EDy2GTensTSt9d5Q/gu3SOD5zHJLodkVR0KZooduy50lUdNxhXOteVUe3wtvO6qvGHvMkdJUyoI5Zx5lGLbg7DRop64U5bHPtSuv3ojn6GQBgJj35JP6rmb7CowNQ0nZfe6ODCUmpfvAvPG6WCBFX8VN3XDTy2j1ugEzf37JxNPPOXAq0Mzh284A1qTTFElZ7Tdt8fu/VEsLnseIeLfwmsHa59HFOMD2iS6qKv5l8524Ogb+NRpVLdIPqp9qP+M0cAgsEhiq6et3rySJENi81gZWziiHhTb8cRKLVxDh0BFCd8h50O+u8Jz7WY98vTqe6MDpn+zrUv8RWgJw7z9ByM6l+TMqlI3InFD6bWNmORzni8Bx5sn75qdEQaeXGu9Fyz9vJjPIlVmzzvQsBuUF5sjV3mFegoaYRIRla4hDK7gKVVv/TYgGZbkh/XB9JY4ebA3mBiYoEK6No2jsKiJOvaZbKy7QPbitsw+XS6zyGksizcmyyM7pFabKFCwApaXHkiDUmH6hlPrEzzyaRP/sortmaNxZbInAq0zxbICek0Y4FXQpFXgh74sxU2YCeHIqcV8sPymJ1Q=----ATTACHMENT:----NTQzODY1MTU2MTkxODU4OSA1MDQwMzM4MjMyNjQ0NjYwIDE2MjM0NDIwNzE5MzM2Nzc=