Inheritance: extends Webiny\Component\StdLib\Exception\AbstractException
Exemplo n.º 1
0
 /**
  * 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;
 }
Exemplo n.º 2
0
 /**
  * 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;
 }