/** * @param string $path * @return mixed * @throws ResourceValidationException */ public function validate(string $path = '') { $messages = new MessageCollection(); foreach ($this->getResourceDefinition()->getFields() as $field) { /** @var ResourceField $field */ $value = $this->properties->getProperty($field); try { if (!isset($value)) { $field->validate(null, $path); } else { $value->validate($path); } } catch (PropertyValidationException $e) { $messages->merge($e->getMessages()); } } // Also check all resource wide requirements try { $this->getResourceDefinition()->getValidators()->validate($this); } catch (ResourceValidationException $e) { $messages->merge($e->getMessages()); } if (count($messages) > 0) { throw ResourceValidationException::make($messages); } }
/** * @param ResourceTransformer $transformer * @param RelationshipField $field * @param mixed $parentEntity * @param PropertyValues $identifiers * @param Context $context * @return mixed */ public function getChildByIdentifiers(ResourceTransformer $transformer, RelationshipField $field, $parentEntity, PropertyValues $identifiers, Context $context) { $entities = $this->resolveProperty($transformer, $parentEntity, $field, $context); if ($entities instanceof Relation) { // Clone to avoid setting multiple filters $entities = clone $entities; foreach ($identifiers->toMap() as $k => $v) { $entities->where($k, $v); } $entity = $entities->get()->first(); if (!$entity) { return null; } return $entity; } foreach ($entities as $entity) { if ($this->entityEquals($transformer, $entity, $identifiers, $context)) { return $entity; } } }
/** * @param ResourceTransformer $transformer * @param $original * @param PropertyValues $identifiers * @param Context $context * @return bool */ protected function entityEquals(ResourceTransformer $transformer, $original, PropertyValues $identifiers, Context $context) { if (count($identifiers->getValues()) === 0) { return false; } foreach ($identifiers->getValues() as $identifier) { $path = $this->splitPathParameters($identifier->getField()->getName()); $propertyValue = $this->resolveChildPath($transformer, $original, $path, $identifier->getField(), $context); if (!$identifier->equals($propertyValue)) { return false; } } return true; }