Exemplo n.º 1
0
 /**
  * Validate model, optionally only selected fields
  * @param string[] $fields
  * @return boolean
  */
 public function validate($fields = [])
 {
     $valid = [];
     if (empty($fields)) {
         $fields = array_keys($this->meta->fields());
     }
     foreach ($fields as $name) {
         $fieldMeta = $this->meta->field($name);
         // Reset errors
         $this->errors[$name] = [];
         // Check if meta for field exists
         if (empty($fieldMeta)) {
             throw new InvalidArgumentException(sprintf("Unknown field `%s` in model `%s`", $name, get_class($this->model)));
         }
         // Validate sub documents
         // Skip fields that are not updatable
         if ($fieldMeta->owned && $fieldMeta->updatable) {
             if (is_array($this->model->{$name})) {
                 // Handle arrays of documents
                 foreach ($this->model->{$name} as $model) {
                     $validator = new Validator($model);
                     $isValid = $validator->validate();
                     $valid[] = (int) $isValid;
                     if (!$isValid) {
                         $errors = $validator->getErrors();
                         $this->setErrors($errors);
                     }
                 }
             } elseif (!empty($this->model->{$name})) {
                 // Handle single documents
                 $validator = new Validator($this->model->{$name});
                 $isValid = $validator->validate();
                 $valid[] = (int) $isValid;
                 if (!$isValid) {
                     $errors = $validator->getErrors();
                     $this->setErrors($errors);
                 }
             }
         }
         // Skip field without validators
         if (empty($fieldMeta->validators)) {
             continue;
         }
         $valid[] = (int) $this->validateEntity($name, $fieldMeta->validators);
     }
     // Model validators
     $typeValidators = $this->meta->type()->validators;
     if (!empty($typeValidators)) {
         $typeName = $this->meta->type()->name;
         // Reset errors
         $this->errors[$typeName] = [];
         $valid[] = (int) $this->validateEntity($typeName, $typeValidators);
     }
     return count($valid) === array_sum($valid);
 }