/** * @param EmbeddedMetadataInterface $embeddedMetadata * * @return EmbeddedMetadataInterface */ private function addNestedEmbeddedClasses(EmbeddedMetadataInterface $embeddedMetadata) { $reflClass = new \ReflectionClass($embeddedMetadata->getClassAttribute()); foreach ($reflClass->getProperties() as $reflProperty) { if ($annotation = $this->reader->getPropertyAnnotation($reflProperty, Index::class)) { $embeddedMetadata->addEmbeddableClass(new IndexMetadata($reflProperty->class, $reflProperty->name, $annotation->name, $annotation->type)); } if ($annotation = $this->reader->getPropertyAnnotation($reflProperty, Embedded::class)) { $nested = $this->addNestedEmbeddedClasses(new EmbeddedMetadata($reflProperty->class, $reflProperty->name, $annotation->class)); $embeddedMetadata->addEmbeddableClass($nested); } } return $embeddedMetadata; }
/** * @param EmbeddedMetadataInterface $embeddedMetadata * @param array $data * * @return object */ private function getEmbeddedObject(EmbeddedMetadataInterface $embeddedMetadata, array $data) { $embedded = $this->instantiator->instantiate($embeddedMetadata->getClassAttribute()); foreach ($embeddedMetadata->getEmbeddableClasses() as $embeddableMetadata) { if ($embeddableMetadata instanceof IndexMetadataInterface) { $name = $embeddableMetadata->getNameAttribute(); $type = $embeddableMetadata->getTypeAttribute(); $value = Type::getType($type)->convertToPHPValue($this->get($data, $name)); $embeddableMetadata->setValue($embedded, $value); } if ($embeddableMetadata instanceof EmbeddedMetadataInterface) { $object = $this->getEmbeddedObject($embeddableMetadata, $this->get($data, $embeddableMetadata->getPropertyName(), [])); $embeddableMetadata->setValue($embedded, $object); } } return $embedded; }