/**
* INTERNAL: Performance sensitive method
*
* @throws MarshallerException
* @param object $mappedObject
* @param WriterHelper $writer
* @return void
*/
private function doMarshal($mappedObject, WriterHelper $writer)
{
$className = get_class($mappedObject);
$classMetadata = $this->classMetadataFactory->getMetadataFor($className);
if (!$this->classMetadataFactory->hasMetadataFor($className)) {
throw MarshallerException::mappingNotFoundForClass($className);
}
// PreMarshall Hook
if ($classMetadata->hasLifecycleCallbacks(Events::preMarshal)) {
$classMetadata->invokeLifecycleCallbacks(Events::preMarshal, $mappedObject);
}
$writer->startElement($classMetadata->getXmlName());
$namespaces = $classMetadata->getXmlNamespaces();
if (!empty($namespaces)) {
foreach ($namespaces as $namespace) {
$writer->writeNamespace($namespace['url'], $namespace['prefix']);
}
}
// build ordered field mappings for this class
$fieldMappings = $classMetadata->getFieldMappings();
$orderedMap = array();
if (!empty($fieldMappings)) {
foreach ($fieldMappings as $fieldMapping) {
$orderedMap[$fieldMapping['node']][] = $fieldMapping;
}
}
// do attributes
if (array_key_exists(ClassMetadata::XML_ATTRIBUTE, $orderedMap)) {
foreach ($orderedMap[ClassMetadata::XML_ATTRIBUTE] as $fieldMapping) {
$fieldName = $fieldMapping['fieldName'];
$fieldValue = $classMetadata->getFieldValue($mappedObject, $fieldName);
if ($classMetadata->isRequired($fieldName) && $fieldValue === null) {
throw MarshallerException::fieldRequired($className, $fieldName);
}
if ($fieldValue !== null || $classMetadata->isNillable($fieldName)) {
$this->_writeAttribute($writer, $classMetadata, $fieldName, $fieldValue);
}
}
}
// do text
if (array_key_exists(ClassMetadata::XML_TEXT, $orderedMap)) {
foreach ($orderedMap[ClassMetadata::XML_TEXT] as $fieldMapping) {
$fieldName = $fieldMapping['fieldName'];
$fieldValue = $classMetadata->getFieldValue($mappedObject, $fieldName);
if ($classMetadata->isRequired($fieldName) && $fieldValue === null) {
throw MarshallerException::fieldRequired($className, $fieldName);
}
if ($fieldValue !== null || $classMetadata->isNillable($fieldName)) {
$this->_writeText($writer, $classMetadata, $fieldName, $fieldValue);
}
}
}
// do elements
if (array_key_exists(ClassMetadata::XML_ELEMENT, $orderedMap)) {
foreach ($orderedMap[ClassMetadata::XML_ELEMENT] as $fieldMapping) {
$fieldName = $fieldMapping['fieldName'];
$fieldValue = $classMetadata->getFieldValue($mappedObject, $fieldName);
if ($classMetadata->isRequired($fieldName) && $fieldValue === null) {
throw MarshallerException::fieldRequired($className, $fieldName);
}
if ($fieldValue !== null || $classMetadata->isNillable($fieldName)) {
$this->_writeElement($writer, $classMetadata, $fieldName, $fieldValue);
}
}
}
// PostMarshal hook
if ($classMetadata->hasLifecycleCallbacks(Events::postMarshal)) {
$classMetadata->invokeLifecycleCallbacks(Events::postMarshal, $mappedObject);
}
$writer->endElement();
}