/** * Populate entity with given data * * @param array $data * * @throws EntityException * @return $this */ public function populate($data) { if (is_null($data)) { return $this; } $data = $this->normalizeData($data); $fromDb = false; if ($this->isDbData($data)) { $fromDb = true; } else { unset($data['id']); unset($data['_id']); } $validation = $this->arr(); /* @var $entityAttribute AbstractAttribute */ foreach ($this->attributes as $attributeName => $entityAttribute) { if (!$entityAttribute->getAfterPopulate()) { $this->populateAttribute($attributeName, $entityAttribute, $validation, $data, $fromDb); } } foreach ($this->attributes as $attributeName => $entityAttribute) { if ($entityAttribute->getAfterPopulate()) { $this->populateAttribute($attributeName, $entityAttribute, $validation, $data, $fromDb); } } if ($validation->count() > 0) { $attributes = []; foreach ($validation as $attr => $error) { foreach ($error as $key => $value) { $attributes[$key] = $value; } } $ex = new EntityException(EntityException::VALIDATION_FAILED, [$validation->count()]); $ex->setInvalidAttributes($attributes); throw $ex; } return $this; }
/** * Populate entity with given data * * @param array $data * * @throws EntityException * @return $this */ public function populate($data) { $entityCollectionClass = '\\Webiny\\Component\\Entity\\EntityCollection'; $validation = $this->arr(); /* @var $entityAttribute AttributeAbstract */ foreach ($this->attributes as $attributeName => $entityAttribute) { // Check if attribute is required and it's value is set if ($entityAttribute->getRequired() && !isset($data[$attributeName])) { $validation[$attributeName] = new ValidationException(ValidationException::REQUIRED_ATTRIBUTE_IS_MISSING, [$attributeName]); continue; } // If 'required' check is passed, continue with other checks $canPopulate = !$this->getId()->getValue() || !$entityAttribute->getOnce(); if (isset($data[$attributeName]) && $canPopulate) { $dataValue = $data[$attributeName]; $isOne2Many = $this->isInstanceOf($entityAttribute, AttributeType::ONE2MANY); $isMany2Many = $this->isInstanceOf($entityAttribute, AttributeType::MANY2MANY); $isMany2One = $this->isInstanceOf($entityAttribute, AttributeType::MANY2ONE); if ($isMany2One) { try { $entityAttribute->validate($dataValue)->setValue($dataValue); } catch (ValidationException $e) { $validation[$attributeName] = $e; continue; } } elseif ($isOne2Many) { $entityClass = $entityAttribute->getEntity(); // Validate One2Many attribute value if (!$this->isArray($dataValue) && !$this->isArrayObject($dataValue) && !$this->isInstanceOf($dataValue, $entityCollectionClass)) { $validation[$attributeName] = new ValidationException(ValidationException::ATTRIBUTE_VALIDATION_FAILED, [$attributeName, 'array, ArrayObject or EntityCollection', gettype($dataValue)]); continue; } /* @var $entityAttribute One2ManyAttribute */ foreach ($dataValue as $item) { $itemEntity = false; // $item can be an array of data, EntityAbstract or a simple MongoId string if ($this->isInstanceOf($item, '\\Webiny\\Component\\Entity\\EntityAbstract')) { $itemEntity = $item; } elseif ($this->isArray($item) || $this->isArrayObject($item)) { $itemEntity = $entityClass::findById(isset($item['id']) ? $item['id'] : false); } elseif ($this->isString($item) && $this->entity()->getDatabase()->isMongoId($item)) { $itemEntity = $entityClass::findById($item); } // If instance was not found, create a new entity instance if (!$itemEntity) { $itemEntity = new $entityClass(); } // If $item is an array - use it to populate the entity instance if ($this->isArray($item) || $this->isArrayObject($item)) { $itemEntity->populate($item); } // Add One2Many entity instance to current entity's attribute $entityAttribute->add($itemEntity); } } elseif ($isMany2Many) { $entityAttribute->add($dataValue); } else { try { $entityAttribute->validate($dataValue)->setValue($dataValue); } catch (ValidationException $e) { $validation[$attributeName] = $e; } } } } if ($validation->count() > 0) { $ex = new EntityException(EntityException::VALIDATION_FAILED, [$validation->count()]); $ex->setInvalidAttributes($validation); throw $ex; } return $this; }