/** * Returns TRUE if the given value passes validation. * * @param string $value A value to test * * @return boolean */ public function isValid($value) { if ($this->skipValidation) { return true; } $datatype = $this->validation['datatype']; //NULL check, empty strings are considered null if (in_array($datatype, array('string', 'url', 'email', 'slug', 'slugwithslash', 'html', 'binary', 'json')) && strlen(trim($value)) == 0) { $value = null; } if ($this->validation['nullable'] === false && $value === null && $datatype != 'boolean') { $this->failureCode = 'nullable'; $this->failureMessage = 'cannot be empty'; return false; } //Nothing more to validate if the value is null... if ($value === null) { return true; } //Check date makes sense if ($datatype === 'date') { //todo: not sure how to check validity of date... it's already a DateTime instance. if (false) { $this->failureCode = 'invalid'; $this->failureMessage = 'is an invalid date'; return false; } } //Validate MIN $min = $this->validation['min']; if ($min != null) { if ($datatype === 'float') { if ($value < floatval($min)) { $this->failureCode = 'min'; $this->failureMessage = 'is less than the minimum value'; return false; } } else { if ($datatype === 'int') { if ($value < intval($min)) { $this->failureCode = 'min'; $this->failureMessage = 'is less than the minimum value'; return false; } } else { if (is_string($value) && strlen($value) < intval($min)) { $this->failureCode = 'minlength'; $this->failureMessage = 'must be at least ' . $min . ' characters'; return false; } } } } //Validate MAX $max = $this->validation['max']; if ($max != null) { if ($datatype === 'float') { if ($value > floatval($max)) { $this->failureCode = 'max'; $this->failureMessage = 'is more than the maximum value'; return false; } } else { if ($datatype === 'int') { if ($value > intval($max)) { $this->failureCode = 'max'; $this->failureMessage = 'is more than the maximum value'; return false; } } else { $maxbytes = intval($max); if (intval($max) < 255) { // count characters if (is_string($value) && StringUtils::charCount($value) > intval($max)) { $this->failureCode = 'maxlength'; $this->failureMessage = 'must be a maximum of ' . $max . ' characters'; return false; } $maxbytes = 255; } // count bytes if (is_string($value) && StringUtils::byteCount($value) > intval($maxbytes)) { $this->failureCode = 'maxlength'; $this->failureMessage = 'must be a maximum of ' . $maxbytes . ' bytes'; return false; } } } } if ($datatype === 'slug') { if (!SlugUtils::isSlug($value, false)) { $this->failureCode = 'invalid'; $this->failureMessage = 'is not a valid slug, cannot contain slashes'; return false; } } if ($datatype === 'slugwithslash') { if (!SlugUtils::isSlug($value, true)) { $this->failureCode = 'invalid'; $this->failureMessage = 'is not a valid slug'; return false; } } if ($datatype === 'url') { if (!URLUtils::isUrl($value)) { $this->failureCode = 'invalid'; $this->failureMessage = 'is not a valid URL'; return false; } } if ($datatype === 'email') { if (!EmailUtils::isEmailAddress($value)) { $this->failureCode = 'invalid'; $this->failureMessage = 'is not a valid email address'; return false; } } if ($datatype === 'json') { if (!JSONUtils::isValid($value)) { $this->failureCode = 'invalid'; $this->failureMessage = 'is not a valid json string'; return false; } } //Validate MATCH expression $match = $this->validation['match']; if ($match != null) { // Automatically escape unescaped slashes in the match before running it $match = preg_replace('/([^\\\\])\\//', '$1\\/', $match); if (preg_match('/' . $match . '/s', $value) === 0) { $this->failureCode = 'invalid'; //$this->failureMessage = 'is invalid (' . substr($value, 0, 255) . ')'; $this->failureMessage = 'is invalid'; return false; } } // Validate all custom functions foreach ($this->validation['callback'] as $callback) { if (!empty($callback) && call_user_func($callback, $value) === false) { $this->failureCode = $callback; $this->failureMessage = 'is invalid'; return false; } } return true; }
/** * @dataProvider getInvalidJsons * * @param string $string */ public function testIsNotValid($string) { $this->assertNotTrue(\JSONUtils::isValid($string)); }