8
8
* @since 0.2.0
9
9
*
10
10
* @method static bool is(string $type, mixed $value, array $rule = []) Checks if value passes as type
11
+ * @method static bool isAny(mixed $value, array $rule = []) Always returns true
11
12
* @method static bool isNull(mixed $value, array $rule = []) Checks if value is null
12
13
* @method static bool isBool(mixed $value, array $rule = []) Checks if value is boolean
13
14
* @method static bool isBoolean(mixed $value, array $rule = []) Checks if value is boolean
@@ -41,24 +42,26 @@ class Validator
41
42
/**
42
43
* @var Collection
43
44
*/
44
- private $ values ;
45
+ protected $ values ;
45
46
46
47
/**
47
48
* @var Collection
48
49
*/
49
- private $ rules ;
50
+ protected $ rules ;
50
51
51
52
/**
52
53
* @var Collection
53
54
*/
54
- private $ errors ;
55
+ protected $ errors ;
55
56
56
57
/**
57
- * Map of types to validate method names.
58
+ * Map built-in types to associated validate method
58
59
*
59
60
* @var array
60
61
*/
61
- private $ validateTypeMethodMap = [
62
+ protected $ typeValidateFunctionMap = [
63
+ '* ' => 'validateAny ' ,
64
+ 'any ' => 'validateAny ' ,
62
65
'null ' => 'validateNull ' ,
63
66
'bool ' => 'validateBoolean ' ,
64
67
'boolean ' => 'validateBoolean ' ,
@@ -220,26 +223,52 @@ public function rules() : array
220
223
*/
221
224
public function validate () : bool
222
225
{
223
- if (! empty ( $ this ->rules )) {
226
+ if ($ this ->rules -> count ( )) {
224
227
foreach ($ this ->rules as $ name => $ rule ) {
225
- if (array_key_exists ($ name , $ this ->values ->toArray ())) {
226
- if (is_string ($ rule )) {
227
- // Rebuild $rule into proper format
228
- // e.g. 'email' -> ['type' => 'email']
229
- $ rule = ['type ' => $ rule ];
228
+ // Convert string/closure rules into proper rule format
229
+ if (is_string ($ rule )) {
230
+ $ rule = ['type ' => $ rule ];
231
+ } elseif ($ rule instanceof \Closure || is_callable ($ rule )) {
232
+ // Rule uses closure/callable for validation
233
+ $ rule = ['type ' => 'any ' , 'validator ' => $ rule ];
234
+ }
235
+
236
+ // Make sure rule is formatted correctly
237
+ if (!is_array ($ rule ) || !isset ($ rule ['type ' ])) {
238
+ throw new \InvalidArgumentException ("Rule format for ' $ name' is invalid. " );
239
+ }
240
+
241
+ // Value is required by default
242
+ if (!isset ($ rule ['required ' ])) {
243
+ $ rule ['required ' ] = true ;
244
+ }
245
+
246
+ // Check if value exists
247
+ if ($ value = $ this ->values ->get ($ name , false )) {
248
+ // Validate using type validators
249
+ if (!$ this ->validateType ($ rule ['type ' ], $ value , $ rule )) {
250
+ $ this ->setError ($ name , "' $ value' is not valid {$ rule ['type ' ]} for ' $ name'. " );
251
+ continue ;
230
252
}
231
- if (isset ($ rule ['type ' ])) {
232
- if (!$ this ->validateType ($ rule ['type ' ], $ this ->values [$ name ], $ rule )) {
233
- // Error: Value for '%s' is invalid
234
- $ this ->setError ($ name , "Value for ' $ name' is invalid. Expected {$ rule ['type ' ]}. " );
253
+
254
+ // Validate using closure/callable validator
255
+ if (isset ($ rule ['validator ' ])) {
256
+ if ($ rule ['validator ' ] instanceof \Closure) {
257
+ if (!$ rule ['validator ' ]($ name , $ value , $ this )) {
258
+ $ this ->setError ($ name , "' $ value' is not valid for ' $ name'. " );
259
+ continue ;
260
+ }
261
+ } elseif (is_callable ($ rule ['validator ' ])) {
262
+ if (!call_user_func_array ($ rule ['validator ' ], [$ name , $ value , $ this ])) {
263
+ $ this ->setError ($ name , "' $ value' is not valid for ' $ name'. " );
264
+ continue ;
265
+ }
235
266
}
236
- } else {
237
- throw new \InvalidArgumentException ("Invalid rule for ' $ name' " );
238
267
}
239
268
} else {
240
- if (isset ( $ rule [ ' required ' ]) && $ rule ['required ' ]) {
241
- // Error: Value for '%s ' is required
242
- $ this -> setError ( $ name , " Value for ' $ name ' is required " ) ;
269
+ if ($ rule ['required ' ]) {
270
+ $ this -> setError ( $ name , " Value for ' $ name ' is required. " );
271
+ continue ;
243
272
}
244
273
}
245
274
}
@@ -299,11 +328,22 @@ public function hasErrors() : bool
299
328
public function validateType ($ type , $ value , array $ rule = []) : bool
300
329
{
301
330
$ type = strtolower ($ type );
302
- if (isset ($ this ->validateTypeMethodMap [$ type ])) {
303
- return $ this ->{$ this ->validateTypeMethodMap [$ type ]}($ value , $ rule );
304
- } else {
305
- throw new \InvalidArgumentException ("Type ' $ type' is not a valid rule type " );
331
+ if (isset ($ this ->typeValidateFunctionMap [$ type ])) {
332
+ return $ this ->{$ this ->typeValidateFunctionMap [$ type ]}($ value , $ rule );
306
333
}
334
+ throw new \InvalidArgumentException ("Type ' $ type' is not a valid rule type " );
335
+ }
336
+
337
+ /**
338
+ * No validation is done. Always returns true.
339
+ *
340
+ * @param $value
341
+ * @param array $rule
342
+ * @return bool
343
+ */
344
+ protected function validateAny ($ value , array $ rule = []) : bool
345
+ {
346
+ return true ;
307
347
}
308
348
309
349
/**
@@ -313,7 +353,7 @@ public function validateType($type, $value, array $rule = []) : bool
313
353
* @param array $rule
314
354
* @return bool
315
355
*/
316
- private function validateNull ($ value , array $ rule = []) : bool
356
+ protected function validateNull ($ value , array $ rule = []) : bool
317
357
{
318
358
return is_null ($ value );
319
359
}
@@ -325,7 +365,7 @@ private function validateNull($value, array $rule = []) : bool
325
365
* @param array $rule
326
366
* @return bool
327
367
*/
328
- private function validateBoolean ($ value , array $ rule = []) : bool
368
+ protected function validateBoolean ($ value , array $ rule = []) : bool
329
369
{
330
370
return is_bool ($ value );
331
371
}
@@ -337,7 +377,7 @@ private function validateBoolean($value, array $rule = []) : bool
337
377
* @param array $rule
338
378
* @return bool
339
379
*/
340
- private function validateScalar ($ value , array $ rule = []) : bool
380
+ protected function validateScalar ($ value , array $ rule = []) : bool
341
381
{
342
382
return is_scalar ($ value );
343
383
}
@@ -349,7 +389,7 @@ private function validateScalar($value, array $rule = []) : bool
349
389
* @param array $rule
350
390
* @return bool
351
391
*/
352
- private function validateArray ($ value , array $ rule = []) : bool
392
+ protected function validateArray ($ value , array $ rule = []) : bool
353
393
{
354
394
return is_array ($ value );
355
395
}
@@ -361,7 +401,7 @@ private function validateArray($value, array $rule = []) : bool
361
401
* @param array $rule
362
402
* @return bool
363
403
*/
364
- private function validateObject ($ value , array $ rule = []) : bool
404
+ protected function validateObject ($ value , array $ rule = []) : bool
365
405
{
366
406
return is_object ($ value );
367
407
}
@@ -373,7 +413,7 @@ private function validateObject($value, array $rule = []) : bool
373
413
* @param array $rule
374
414
* @return bool
375
415
*/
376
- private function validateString ($ value , array $ rule = []) : bool
416
+ protected function validateString ($ value , array $ rule = []) : bool
377
417
{
378
418
return is_string ($ value );
379
419
}
@@ -385,7 +425,7 @@ private function validateString($value, array $rule = []) : bool
385
425
* @param array $rule
386
426
* @return bool
387
427
*/
388
- private function validateInteger ($ value , array $ rule = []) : bool
428
+ protected function validateInteger ($ value , array $ rule = []) : bool
389
429
{
390
430
return is_int ($ value );
391
431
}
@@ -397,7 +437,7 @@ private function validateInteger($value, array $rule = []) : bool
397
437
* @param array $rule
398
438
* @return bool
399
439
*/
400
- private function validateNumeric ($ value , array $ rule = []) : bool
440
+ protected function validateNumeric ($ value , array $ rule = []) : bool
401
441
{
402
442
return is_numeric ($ value );
403
443
}
@@ -409,7 +449,7 @@ private function validateNumeric($value, array $rule = []) : bool
409
449
* @param array $rule
410
450
* @return bool
411
451
*/
412
- private function validateFloat ($ value , array $ rule = []) : bool
452
+ protected function validateFloat ($ value , array $ rule = []) : bool
413
453
{
414
454
return is_float ($ value );
415
455
}
@@ -421,7 +461,7 @@ private function validateFloat($value, array $rule = []) : bool
421
461
* @param array $rule
422
462
* @return bool
423
463
*/
424
- private function validateAlphaNumeric ($ value , array $ rule = []) : bool
464
+ protected function validateAlphaNumeric ($ value , array $ rule = []) : bool
425
465
{
426
466
return is_string ($ value ) && ctype_alnum ($ value );
427
467
}
@@ -433,7 +473,7 @@ private function validateAlphaNumeric($value, array $rule = []) : bool
433
473
* @param array $rule
434
474
* @return bool
435
475
*/
436
- private function validateAlpha ($ value , array $ rule = []) : bool
476
+ protected function validateAlpha ($ value , array $ rule = []) : bool
437
477
{
438
478
return is_string ($ value ) && ctype_alpha ($ value );
439
479
}
@@ -445,7 +485,7 @@ private function validateAlpha($value, array $rule = []) : bool
445
485
* @param array $rule
446
486
* @return bool
447
487
*/
448
- private function validateEmail ($ value , array $ rule = []) : bool
488
+ protected function validateEmail ($ value , array $ rule = []) : bool
449
489
{
450
490
return (bool ) filter_var ($ value , FILTER_VALIDATE_EMAIL );
451
491
}
@@ -457,7 +497,7 @@ private function validateEmail($value, array $rule = []) : bool
457
497
* @param array $rule
458
498
* @return bool
459
499
*/
460
- private function validateIP ($ value , array $ rule = []) : bool
500
+ protected function validateIP ($ value , array $ rule = []) : bool
461
501
{
462
502
return $ this ->validateIPv4 ($ value , $ rule ) || $ this ->validateIPv6 ($ value , $ rule );
463
503
}
@@ -469,7 +509,7 @@ private function validateIP($value, array $rule = []) : bool
469
509
* @param array $rule
470
510
* @return bool
471
511
*/
472
- private function validateIPv4 ($ value , array $ rule = []) : bool
512
+ protected function validateIPv4 ($ value , array $ rule = []) : bool
473
513
{
474
514
return (bool ) filter_var ($ value , FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 );
475
515
}
@@ -481,7 +521,7 @@ private function validateIPv4($value, array $rule = []) : bool
481
521
* @param array $rule
482
522
* @return bool
483
523
*/
484
- private function validateIPv6 ($ value , array $ rule = []) : bool
524
+ protected function validateIPv6 ($ value , array $ rule = []) : bool
485
525
{
486
526
return (bool ) filter_var ($ value , FILTER_VALIDATE_IP , FILTER_FLAG_IPV6 );
487
527
}
@@ -493,7 +533,7 @@ private function validateIPv6($value, array $rule = []) : bool
493
533
* @param array $rule
494
534
* @return bool
495
535
*/
496
- private function validateClosure ($ value , array $ rule = []) : bool
536
+ protected function validateClosure ($ value , array $ rule = []) : bool
497
537
{
498
538
return ($ value instanceof \Closure);
499
539
}
@@ -505,7 +545,7 @@ private function validateClosure($value, array $rule = []) : bool
505
545
* @param array $rule
506
546
* @return bool
507
547
*/
508
- private function validateCallable ($ value , array $ rule = []) : bool
548
+ protected function validateCallable ($ value , array $ rule = []) : bool
509
549
{
510
550
return is_callable ($ value );
511
551
}
@@ -517,7 +557,7 @@ private function validateCallable($value, array $rule = []) : bool
517
557
* @param array $rule
518
558
* @return bool
519
559
*/
520
- private function validateDateTime ($ value , array $ rule = []) : bool
560
+ protected function validateDateTime ($ value , array $ rule = []) : bool
521
561
{
522
562
if (!is_string ($ value ) && !is_int ($ value )) {
523
563
return false ;
0 commit comments