Example #1
0
 /**
  * Load an entity relation object into the entity object
  *
  * @param \Spot\Entity $entity
  * @param string $field
  * @param \Spot\Entity\Relation\AbstractRelation
  * @param \Spot\Mapper $mapper
  * @param bool $reload
  * @return \Spot\Entity\EntityInterface
  * @throws \InvalidArgumentException
  */
 protected function loadRelationObject($entity, $field, $relation, Mapper $mapper, $reload = false)
 {
     $entityName = $entity instanceof ResultsetInterface ? $entity->getEntityName() : $entity->toString();
     if (empty($entityName)) {
         throw new \InvalidArgumentException("Cannot load relation with a null \$entityName");
     }
     if (isset($entity->{$field}) && !$reload) {
         return $entity->{$field};
     }
     $relationEntity = isset($relation['entity']) ? $relation['entity'] : false;
     if (!$relationEntity) {
         throw new \InvalidArgumentException("Entity for '" . $field . "' relation has not been defined.");
     }
     // Self-referencing entity relationship?
     $relationEntity == ':self' && ($relationEntity = $entityName);
     // Load relation class to lazy-loading relations on demand
     $relationClass = '\\Spot\\Entity\\Relation\\' . $relation['type'];
     // Set field equal to relation class instance
     $relation = new $relationClass($mapper, $this->entityManager, $entity, $relation);
     // Inject relation object into entity property
     if (!$entity instanceof ResultsetInterface) {
         $entity->set($field, $relation);
     }
     return $relation;
 }
Example #2
0
 /**
  * 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();
 }