/** * Run set validation rules on fields */ public function validate(\Spot\Entity $entity) { $v = new \Valitron\Validator($entity->data()); // Check validation rules on each feild $uniqueWhere = []; foreach ($this->fields() as $field => $fieldAttrs) { // Required field if (isset($fieldAttrs['required']) && true === $fieldAttrs['required']) { $v->rule('required', $field); } // Unique field if ($entity->isNew() && isset($fieldAttrs['unique']) && !empty($fieldAttrs['unique'])) { if (is_string($fieldAttrs['unique'])) { // Named group $fieldKeyName = $fieldAttrs['unique']; $uniqueWhere[$fieldKeyName][$field] = $entity->{$field}; } else { $uniqueWhere[$field] = $entity->{$field}; } } // Run only if field required if ($entity->{$field} !== null && $fieldAttrs['required'] === true) { // Field with 'options' if (isset($fieldAttrs['options']) && is_array($fieldAttrs['options'])) { $v->rule('in', $field, $fieldAttrs['options']); } // Valitron validation rules if (isset($fieldAttrs['validation']) && is_array($fieldAttrs['validation'])) { foreach ($fieldAttrs['validation'] as $rule => $ruleName) { $params = []; if (is_string($rule)) { $params = (array) $ruleName; $ruleName = $rule; } $params = array_merge(array($ruleName, $field), $params); call_user_func_array(array($v, 'rule'), $params); } } } } // Unique validation if (!empty($uniqueWhere)) { foreach ($uniqueWhere as $field => $value) { if (!is_array($value)) { $value = [$field => $entity->{$field}]; } if ($this->first($value) !== false) { $entity->error($field, "" . ucwords(str_replace('_', ' ', $field)) . " '" . implode('-', $value) . "' is already taken."); } } } if (!$v->validate()) { $entity->errors($v->errors(), false); } // Return error result return !$entity->hasErrors(); }