Doctrine\ODM\CouchDB\Mapping\EmbeddedDocumentSerializer::serializeEmbeddedDocument PHP Method

serializeEmbeddedDocument() public method

Serializes an embedded document value into array given the mapping metadata for the class.
public serializeEmbeddedDocument ( object $embeddedValue, array $embeddedFieldMapping, $embedMany = false ) : array
$embeddedValue object
$embeddedFieldMapping array
$embedMany
return array
    public function serializeEmbeddedDocument($embeddedValue, $embeddedFieldMapping, $embedMany = false)
    {
        if ($embeddedValue === null) {
            return null;
        }
        if (!$embedMany && 'many' == $embeddedFieldMapping['embedded'] && (is_array($embeddedValue) || $embeddedValue instanceof \Traversable)) {
            $data = array();
            foreach ($embeddedValue as $key => $val) {
                $data[$key] = $this->serializeEmbeddedDocument($val, $embeddedFieldMapping, true);
            }
        } else {
            $embeddedClass = null;
            if (isset($embeddedFieldMapping['targetDocument'])) {
                $embeddedClass = $this->metadataFactory->getMetadataFor(ClassUtils::getClass($embeddedValue));
                if ($embeddedClass->name !== $embeddedFieldMapping['targetDocument'] && !is_subclass_of($embeddedClass->name, $embeddedFieldMapping['targetDocument'])) {
                    throw new \InvalidArgumentException('Mismatching metadata description in the EmbeddedDocument, expected class ' . $embeddedFieldMapping['targetDocument'] . ' but got ' . get_class($embeddedValue));
                }
            } else {
                $embeddedClass = $this->metadataFactory->getMetadataFor(get_class($embeddedValue));
            }
            $data = $this->metadataResolver->createDefaultDocumentStruct($embeddedClass);
            foreach ($embeddedClass->reflFields as $fieldName => $reflProperty) {
                $value = $reflProperty->getValue($embeddedValue);
                $fieldMapping = $embeddedClass->fieldMappings[$fieldName];
                if ($value === null) {
                    continue;
                } else {
                    if (isset($fieldMapping['embedded'])) {
                        $data[$fieldMapping['jsonName']] = $this->serializeEmbeddedDocument($value, $fieldMapping);
                    } else {
                        $data[$fieldMapping['jsonName']] = Type::getType($fieldMapping['type'])->convertToCouchDBValue($value);
                    }
                }
            }
        }
        return $data;
    }