103 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
		
		
			
		
	
	
			103 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
|  | <?php | ||
|  | 
 | ||
|  | class Validator { | ||
|  |     private $errors = []; | ||
|  |     private $data = []; | ||
|  | 
 | ||
|  |     public function __construct(array $data) { | ||
|  |         $this->data = $data; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function validate(array $rules) { | ||
|  |         foreach ($rules as $field => $fieldRules) { | ||
|  |             foreach ($fieldRules as $rule => $parameter) { | ||
|  |                 $this->applyRule($field, $rule, $parameter); | ||
|  |             } | ||
|  |         } | ||
|  |         return empty($this->errors); | ||
|  |     } | ||
|  | 
 | ||
|  |     private function applyRule($field, $rule, $parameter) { | ||
|  |         $value = $this->data[$field] ?? null; | ||
|  | 
 | ||
|  |         switch ($rule) { | ||
|  |             case 'required': | ||
|  |                 if ($parameter && empty($value)) { | ||
|  |                     $this->addError($field, "Field is required"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'email': | ||
|  |                 if (!empty($value) && !filter_var($value, FILTER_VALIDATE_EMAIL)) { | ||
|  |                     $this->addError($field, "Invalid email format"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'min': | ||
|  |                 if (!empty($value) && strlen($value) < $parameter) { | ||
|  |                     $this->addError($field, "Minimum length is $parameter characters"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'max': | ||
|  |                 if (!empty($value) && strlen($value) > $parameter) { | ||
|  |                     $this->addError($field, "Maximum length is $parameter characters"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'numeric': | ||
|  |                 if (!empty($value) && !is_numeric($value)) { | ||
|  |                     $this->addError($field, "Must be a number"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'phone': | ||
|  |                 if (!empty($value) && !preg_match('/^[+]?[\d\s-()]{7,}$/', $value)) { | ||
|  |                     $this->addError($field, "Invalid phone number format"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'url': | ||
|  |                 if (!empty($value) && !filter_var($value, FILTER_VALIDATE_URL)) { | ||
|  |                     $this->addError($field, "Invalid URL format"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'date': | ||
|  |                 if (!empty($value)) { | ||
|  |                     $date = date_parse($value); | ||
|  |                     if ($date['error_count'] > 0) { | ||
|  |                         $this->addError($field, "Invalid date format"); | ||
|  |                     } | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'in': | ||
|  |                 if (!empty($value) && !in_array($value, $parameter)) { | ||
|  |                     $this->addError($field, "Invalid option selected"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |             case 'matches': | ||
|  |                 if ($value !== ($this->data[$parameter] ?? null)) { | ||
|  |                     $this->addError($field, "Does not match $parameter field"); | ||
|  |                 } | ||
|  |                 break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     private function addError($field, $message) { | ||
|  |         if (!isset($this->errors[$field])) { | ||
|  |             $this->errors[$field] = []; | ||
|  |         } | ||
|  |         $this->errors[$field][] = $message; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getErrors() { | ||
|  |         return $this->errors; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function hasErrors() { | ||
|  |         return !empty($this->errors); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getFirstError() { | ||
|  |         if (!$this->hasErrors()) { | ||
|  |             return null; | ||
|  |         } | ||
|  |         $firstField = array_key_first($this->errors); | ||
|  |         return $this->errors[$firstField][0]; | ||
|  |     } | ||
|  | } |