Rule.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <?php
  2. namespace Illuminate\Validation;
  3. use Illuminate\Contracts\Support\Arrayable;
  4. use Illuminate\Support\Arr;
  5. use Illuminate\Support\Traits\Macroable;
  6. use Illuminate\Validation\Rules\AnyOf;
  7. use Illuminate\Validation\Rules\ArrayRule;
  8. use Illuminate\Validation\Rules\Can;
  9. use Illuminate\Validation\Rules\Date;
  10. use Illuminate\Validation\Rules\Dimensions;
  11. use Illuminate\Validation\Rules\Email;
  12. use Illuminate\Validation\Rules\Enum;
  13. use Illuminate\Validation\Rules\ExcludeIf;
  14. use Illuminate\Validation\Rules\ExcludeUnless;
  15. use Illuminate\Validation\Rules\Exists;
  16. use Illuminate\Validation\Rules\File;
  17. use Illuminate\Validation\Rules\ImageFile;
  18. use Illuminate\Validation\Rules\In;
  19. use Illuminate\Validation\Rules\NotIn;
  20. use Illuminate\Validation\Rules\Numeric;
  21. use Illuminate\Validation\Rules\ProhibitedIf;
  22. use Illuminate\Validation\Rules\ProhibitedUnless;
  23. use Illuminate\Validation\Rules\RequiredIf;
  24. use Illuminate\Validation\Rules\RequiredUnless;
  25. use Illuminate\Validation\Rules\StringRule;
  26. use Illuminate\Validation\Rules\Unique;
  27. class Rule
  28. {
  29. use Macroable;
  30. /**
  31. * Get a can constraint builder instance.
  32. *
  33. * @param string $ability
  34. * @param mixed ...$arguments
  35. * @return \Illuminate\Validation\Rules\Can
  36. */
  37. public static function can($ability, ...$arguments)
  38. {
  39. return new Can($ability, $arguments);
  40. }
  41. /**
  42. * Apply the given rules if the given condition is truthy.
  43. *
  44. * @param callable|bool $condition
  45. * @param \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule|\Illuminate\Contracts\Validation\Rule|\Closure|array|string $rules
  46. * @param \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule|\Illuminate\Contracts\Validation\Rule|\Closure|array|string $defaultRules
  47. * @return \Illuminate\Validation\ConditionalRules
  48. */
  49. public static function when($condition, $rules, $defaultRules = [])
  50. {
  51. return new ConditionalRules($condition, $rules, $defaultRules);
  52. }
  53. /**
  54. * Apply the given rules if the given condition is falsy.
  55. *
  56. * @param callable|bool $condition
  57. * @param \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule|\Illuminate\Contracts\Validation\Rule|\Closure|array|string $rules
  58. * @param \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule|\Illuminate\Contracts\Validation\Rule|\Closure|array|string $defaultRules
  59. * @return \Illuminate\Validation\ConditionalRules
  60. */
  61. public static function unless($condition, $rules, $defaultRules = [])
  62. {
  63. return new ConditionalRules($condition, $defaultRules, $rules);
  64. }
  65. /**
  66. * Get an array rule builder instance.
  67. *
  68. * @param array|null $keys
  69. * @return \Illuminate\Validation\Rules\ArrayRule
  70. */
  71. public static function array($keys = null)
  72. {
  73. return new ArrayRule(...func_get_args());
  74. }
  75. /**
  76. * Create a new nested rule set.
  77. *
  78. * @param callable $callback
  79. * @return \Illuminate\Validation\NestedRules
  80. */
  81. public static function forEach($callback)
  82. {
  83. return new NestedRules($callback);
  84. }
  85. /**
  86. * Get a unique constraint builder instance.
  87. *
  88. * @param string $table
  89. * @param string $column
  90. * @return \Illuminate\Validation\Rules\Unique
  91. */
  92. public static function unique($table, $column = 'NULL')
  93. {
  94. return new Unique($table, $column);
  95. }
  96. /**
  97. * Get an exists constraint builder instance.
  98. *
  99. * @param string $table
  100. * @param string $column
  101. * @return \Illuminate\Validation\Rules\Exists
  102. */
  103. public static function exists($table, $column = 'NULL')
  104. {
  105. return new Exists($table, $column);
  106. }
  107. /**
  108. * Get an in rule builder instance.
  109. *
  110. * @param \Illuminate\Contracts\Support\Arrayable|\UnitEnum|array|string $values
  111. * @return \Illuminate\Validation\Rules\In
  112. */
  113. public static function in($values)
  114. {
  115. if ($values instanceof Arrayable) {
  116. $values = $values->toArray();
  117. }
  118. return new In(is_array($values) ? $values : func_get_args());
  119. }
  120. /**
  121. * Get a not_in rule builder instance.
  122. *
  123. * @param \Illuminate\Contracts\Support\Arrayable|\UnitEnum|array|string $values
  124. * @return \Illuminate\Validation\Rules\NotIn
  125. */
  126. public static function notIn($values)
  127. {
  128. if ($values instanceof Arrayable) {
  129. $values = $values->toArray();
  130. }
  131. return new NotIn(is_array($values) ? $values : func_get_args());
  132. }
  133. /**
  134. * Get a required_if rule builder instance.
  135. *
  136. * @param (\Closure(): bool)|bool $callback
  137. * @return \Illuminate\Validation\Rules\RequiredIf
  138. */
  139. public static function requiredIf($callback)
  140. {
  141. return new RequiredIf($callback);
  142. }
  143. /**
  144. * Get a required_unless rule builder instance.
  145. *
  146. * @param (\Closure(): bool)|bool $callback
  147. * @return \Illuminate\Validation\Rules\RequiredUnless
  148. */
  149. public static function requiredUnless($callback)
  150. {
  151. return new RequiredUnless($callback);
  152. }
  153. /**
  154. * Get a exclude_if rule builder instance.
  155. *
  156. * @param (\Closure(): bool)|bool $callback
  157. * @return \Illuminate\Validation\Rules\ExcludeIf
  158. */
  159. public static function excludeIf($callback)
  160. {
  161. return new ExcludeIf($callback);
  162. }
  163. /**
  164. * Get a exclude_unless rule builder instance.
  165. *
  166. * @param (\Closure(): bool)|bool $callback
  167. * @return \Illuminate\Validation\Rules\ExcludeUnless
  168. */
  169. public static function excludeUnless($callback)
  170. {
  171. return new ExcludeUnless($callback);
  172. }
  173. /**
  174. * Get a prohibited_if rule builder instance.
  175. *
  176. * @param (\Closure(): bool)|bool $callback
  177. * @return \Illuminate\Validation\Rules\ProhibitedIf
  178. */
  179. public static function prohibitedIf($callback)
  180. {
  181. return new ProhibitedIf($callback);
  182. }
  183. /**
  184. * Get a prohibited_unless rule builder instance.
  185. *
  186. * @param (\Closure(): bool)|bool $callback
  187. * @return \Illuminate\Validation\Rules\ProhibitedUnless
  188. */
  189. public static function prohibitedUnless($callback)
  190. {
  191. return new ProhibitedUnless($callback);
  192. }
  193. /**
  194. * Get a date rule builder instance.
  195. *
  196. * @return \Illuminate\Validation\Rules\Date
  197. */
  198. public static function date()
  199. {
  200. return new Date;
  201. }
  202. /**
  203. * Get a datetime rule builder instance.
  204. */
  205. public static function dateTime(): Date
  206. {
  207. return (new Date)->format('Y-m-d H:i:s');
  208. }
  209. /**
  210. * Get an email rule builder instance.
  211. *
  212. * @return \Illuminate\Validation\Rules\Email
  213. */
  214. public static function email()
  215. {
  216. return new Email;
  217. }
  218. /**
  219. * Get an enum rule builder instance.
  220. *
  221. * @param class-string $type
  222. * @return \Illuminate\Validation\Rules\Enum
  223. */
  224. public static function enum($type)
  225. {
  226. return new Enum($type);
  227. }
  228. /**
  229. * Get a file rule builder instance.
  230. *
  231. * @return \Illuminate\Validation\Rules\File
  232. */
  233. public static function file()
  234. {
  235. return new File;
  236. }
  237. /**
  238. * Get an image file rule builder instance.
  239. *
  240. * @param bool $allowSvg
  241. * @return \Illuminate\Validation\Rules\ImageFile
  242. */
  243. public static function imageFile($allowSvg = false)
  244. {
  245. return new ImageFile($allowSvg);
  246. }
  247. /**
  248. * Get a dimensions rule builder instance.
  249. *
  250. * @param array $constraints
  251. * @return \Illuminate\Validation\Rules\Dimensions
  252. */
  253. public static function dimensions(array $constraints = [])
  254. {
  255. return new Dimensions($constraints);
  256. }
  257. /**
  258. * Get a string rule builder instance.
  259. *
  260. * @return \Illuminate\Validation\Rules\StringRule
  261. */
  262. public static function string()
  263. {
  264. return new StringRule;
  265. }
  266. /**
  267. * Get a numeric rule builder instance.
  268. *
  269. * @return \Illuminate\Validation\Rules\Numeric
  270. */
  271. public static function numeric()
  272. {
  273. return new Numeric;
  274. }
  275. /**
  276. * Get an "any of" rule builder instance.
  277. *
  278. * @param array $rules
  279. * @return \Illuminate\Validation\Rules\AnyOf
  280. *
  281. * @throws \InvalidArgumentException
  282. */
  283. public static function anyOf($rules)
  284. {
  285. return new AnyOf($rules);
  286. }
  287. /**
  288. * Get a contains rule builder instance.
  289. *
  290. * @param \Illuminate\Contracts\Support\Arrayable|\UnitEnum|array|string $values
  291. * @return \Illuminate\Validation\Rules\Contains
  292. */
  293. public static function contains($values)
  294. {
  295. if ($values instanceof Arrayable) {
  296. $values = $values->toArray();
  297. }
  298. return new Rules\Contains(is_array($values) ? $values : func_get_args());
  299. }
  300. /**
  301. * Get a "does not contain" rule builder instance.
  302. *
  303. * @param \Illuminate\Contracts\Support\Arrayable|\UnitEnum|array|string $values
  304. * @return \Illuminate\Validation\Rules\DoesntContain
  305. */
  306. public static function doesntContain($values)
  307. {
  308. if ($values instanceof Arrayable) {
  309. $values = $values->toArray();
  310. }
  311. return new Rules\DoesntContain(is_array($values) ? $values : func_get_args());
  312. }
  313. /**
  314. * Compile a set of rules for an attribute.
  315. *
  316. * @param string $attribute
  317. * @param array $rules
  318. * @param array|null $data
  319. * @return object|\stdClass
  320. */
  321. public static function compile($attribute, $rules, $data = null)
  322. {
  323. $parser = new ValidationRuleParser(
  324. Arr::undot(Arr::wrap($data))
  325. );
  326. if (is_array($rules) && ! array_is_list($rules)) {
  327. $nested = [];
  328. foreach ($rules as $key => $rule) {
  329. $nested[$attribute.'.'.$key] = $rule;
  330. }
  331. $rules = $nested;
  332. } else {
  333. $rules = [$attribute => $rules];
  334. }
  335. return $parser->explode(ValidationRuleParser::filterConditionalRules($rules, $data));
  336. }
  337. }