/library/Respect/Validation/Validator.php

https://github.com/caferrari/Validation · PHP · 162 lines · 64 code · 15 blank · 83 comment · 7 complexity · d502b31ac5977cd28b674d9f07974c06 MD5 · raw file

  1. <?php
  2. namespace Respect\Validation;
  3. use ReflectionClass;
  4. use ReflectionException;
  5. use Respect\Validation\Exceptions\AllOfException;
  6. use Respect\Validation\Exceptions\ComponentException;
  7. use Respect\Validation\Rules\AllOf;
  8. /**
  9. * @method \Respect\Validation\Validator allOf()
  10. * @method \Respect\Validation\Validator alnum(string $additionalChars = null)
  11. * @method \Respect\Validation\Validator alpha(string $additionalChars = null)
  12. * @method \Respect\Validation\Validator alwaysInvalid()
  13. * @method \Respect\Validation\Validator alwaysValid()
  14. * @method \Respect\Validation\Validator arr()
  15. * @method \Respect\Validation\Validator attribute(string $reference, Validatable $validator = null, bool $mandatory = true)
  16. * @method \Respect\Validation\Validator base()
  17. * @method \Respect\Validation\Validator between(int $min = null, int $max = null, bool $inclusive = false)
  18. * @method \Respect\Validation\Validator bool()
  19. * @method \Respect\Validation\Validator call()
  20. * @method \Respect\Validation\Validator callback(mixed $callback)
  21. * @method \Respect\Validation\Validator charset(array $charset)
  22. * @method \Respect\Validation\Validator cnh()
  23. * @method \Respect\Validation\Validator cnpj()
  24. * @method \Respect\Validation\Validator consonant(string $additionalChars = null)
  25. * @method \Respect\Validation\Validator contains(mixed $containsValue, bool $identical = false)
  26. * @method \Respect\Validation\Validator countryCode()
  27. * @method \Respect\Validation\Validator cpf()
  28. * @method \Respect\Validation\Validator creditCard()
  29. * @method \Respect\Validation\Validator date(string $format = null)
  30. * @method \Respect\Validation\Validator digit(string $additionalChars = null)
  31. * @method \Respect\Validation\Validator directory()
  32. * @method \Respect\Validation\Validator domain()
  33. * @method \Respect\Validation\Validator each(Validatable $itemValidator = null, Validatable $keyValidator = null)
  34. * @method \Respect\Validation\Validator email()
  35. * @method \Respect\Validation\Validator endsWith(mixed $endValue, bool $identical = false)
  36. * @method \Respect\Validation\Validator equals(mixed $compareTo, bool $compareIdentical=false)
  37. * @method \Respect\Validation\Validator even()
  38. * @method \Respect\Validation\Validator float()
  39. * @method \Respect\Validation\Validator graph(string $additionalChars = null)
  40. * @method \Respect\Validation\Validator in(array $haystack, bool $compareIdentical = false)
  41. * @method \Respect\Validation\Validator instance(string $instanceName)
  42. * @method \Respect\Validation\Validator int()
  43. * @method \Respect\Validation\Validator ip(array $ipOptions = null)
  44. * @method \Respect\Validation\Validator json()
  45. * @method \Respect\Validation\Validator key(string $reference, Validatable $referenceValidator = null, bool $mandatory = true)
  46. * @method \Respect\Validation\Validator leapDate(mixed $format)
  47. * @method \Respect\Validation\Validator leapYear()
  48. * @method \Respect\Validation\Validator length(int $min=null, int $max=null, bool $inclusive = true)
  49. * @method \Respect\Validation\Validator lowercase()
  50. * @method \Respect\Validation\Validator macAddress()
  51. * @method \Respect\Validation\Validator max(int $maxValue, bool $inclusive = false)
  52. * @method \Respect\Validation\Validator min(int $minValue, bool $inclusive = false)
  53. * @method \Respect\Validation\Validator minimumAge(int $age)
  54. * @method \Respect\Validation\Validator multiple(int $multipleOf)
  55. * @method \Respect\Validation\Validator negative()
  56. * @method \Respect\Validation\Validator noneOf()
  57. * @method \Respect\Validation\Validator not(Validatable $rule)
  58. * @method \Respect\Validation\Validator notEmpty()
  59. * @method \Respect\Validation\Validator noWhitespace()
  60. * @method \Respect\Validation\Validator nullValue()
  61. * @method \Respect\Validation\Validator numeric()
  62. * @method \Respect\Validation\Validator object()
  63. * @method \Respect\Validation\Validator odd()
  64. * @method \Respect\Validation\Validator oneOf()
  65. * @method \Respect\Validation\Validator perfectSquare()
  66. * @method \Respect\Validation\Validator positive()
  67. * @method \Respect\Validation\Validator primeNumber()
  68. * @method \Respect\Validation\Validator prnt(string $additionalChars = null)
  69. * @method \Respect\Validation\Validator punct(string $additionalChars = null)
  70. * @method \Respect\Validation\Validator regex($regex)
  71. * @method \Respect\Validation\Validator roman()
  72. * @method \Respect\Validation\Validator sf(string $name, array $params = null)
  73. * @method \Respect\Validation\Validator slug()
  74. * @method \Respect\Validation\Validator space(string $additionalChars = null)
  75. * @method \Respect\Validation\Validator startsWith(mixed $startValue, bool $identical = false)
  76. * @method \Respect\Validation\Validator string()
  77. * @method \Respect\Validation\Validator tld()
  78. * @method \Respect\Validation\Validator uppercase()
  79. * @method \Respect\Validation\Validator version()
  80. * @method \Respect\Validation\Validator vowel()
  81. * @method \Respect\Validation\Validator when(Validatable $if, Validatable $then, Validatable $when)
  82. * @method \Respect\Validation\Validator xdigit(string $additionalChars = null)
  83. * @method \Respect\Validation\Validator zend(mixed $validator, array $params = null)
  84. */
  85. class Validator extends AllOf
  86. {
  87. public static function __callStatic($ruleName, $arguments)
  88. {
  89. if ('allOf' === $ruleName) {
  90. return static::buildRule($ruleName, $arguments);
  91. }
  92. $validator = new static;
  93. return $validator->__call($ruleName, $arguments);
  94. }
  95. public static function buildRule($ruleSpec, $arguments=array())
  96. {
  97. if ($ruleSpec instanceof Validatable) {
  98. return $ruleSpec;
  99. }
  100. try {
  101. $validatorFqn = 'Respect\\Validation\\Rules\\' . ucfirst($ruleSpec);
  102. $validatorClass = new ReflectionClass($validatorFqn);
  103. $validatorInstance = $validatorClass->newInstanceArgs(
  104. $arguments
  105. );
  106. return $validatorInstance;
  107. } catch (ReflectionException $e) {
  108. throw new ComponentException($e->getMessage());
  109. }
  110. }
  111. public function __call($method, $arguments)
  112. {
  113. if ('not' === $method) {
  114. return $arguments ? static::buildRule($method, $arguments) : new Rules\Not($this);
  115. }
  116. if (isset($method{4}) &&
  117. substr($method, 0, 4) == 'base' && preg_match('@^base([0-9]{1,2})$@', $method, $match)) {
  118. return $this->addRule(static::buildRule('base', array($match[1])));
  119. }
  120. return $this->addRule(static::buildRule($method, $arguments));
  121. }
  122. public function reportError($input, array $extraParams=array())
  123. {
  124. $exception = new AllOfException;
  125. $input = AllOfException::stringify($input);
  126. $name = $this->getName() ? : "\"$input\"";
  127. $params = array_merge(
  128. $extraParams, get_object_vars($this), get_class_vars(__CLASS__)
  129. );
  130. $exception->configure($name, $params);
  131. if (!is_null($this->template)) {
  132. $exception->setTemplate($this->template);
  133. }
  134. return $exception;
  135. }
  136. /**
  137. * Create instance validator
  138. *
  139. * @static
  140. * @return \Respect\Validation\Validator
  141. */
  142. public static function create()
  143. {
  144. $ref = new ReflectionClass(__CLASS__);
  145. return $ref->newInstanceArgs(func_get_args());
  146. }
  147. }