/** * 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); }
/** * * @param string $name * @return mixed */ public function getFor($name) { if (!array_key_exists($name, $this->transformators)) { if (!$this->meta->{$name}) { throw new TransformatorException(sprintf('There is not metadata for field `%s` of model `%s`, have you declared this field?', $name, get_class($this->getModel()))); } $this->transformators[$name] = $this->_getTransformer($this->transformatorClass, $this->meta->type(), $this->meta->{$name}); } // Support for setting name in sanitizers etc. if ($this->transformators[$name] instanceof NameAwareInterface) { $this->transformators[$name]->setName($name); } return $this->transformators[$name]; }