/** * Stores or updates an object in the underlying storage. * * @param object $object The object to persist * @param string $parentIdentifier * @return string * @api */ protected function persistObject($object, $parentIdentifier) { if (isset($this->visitedDuringPersistence[$object])) { return $this->visitedDuringPersistence[$object]; } $identifier = $this->persistenceSession->getIdentifierByObject($object); $this->visitedDuringPersistence[$object] = $identifier; $objectData = array(); $objectState = $this->storeObject($object, $identifier, $parentIdentifier, $objectData); if ($this->reflectionService->getClassSchema($object)->getModelType() === \TYPO3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY) { $this->persistenceSession->registerReconstitutedEntity($object, $objectData); } $this->emitPersistedObject($object, $objectState); return $identifier; }
/** * Maps a single record into the object it represents and registers it as * reconstituted with the session. * * @param array $objectData * @return object * @throws \TYPO3\FLOW3\Persistence\Generic\Exception\InvalidObjectDataException * @throws \TYPO3\FLOW3\Persistence\Exception */ public function mapToObject(array $objectData) { if ($objectData === array()) { throw new \TYPO3\FLOW3\Persistence\Generic\Exception\InvalidObjectDataException('The array with object data was empty, probably object not found or access denied.', 1277974338); } if ($this->persistenceSession->hasIdentifier($objectData['identifier'])) { return $this->persistenceSession->getObjectByIdentifier($objectData['identifier']); } else { $className = $objectData['classname']; $classSchema = $this->reflectionService->getClassSchema($className); $object = unserialize('O:' . strlen($className) . ':"' . $className . '":0:{};'); $this->persistenceSession->registerObject($object, $objectData['identifier']); if ($classSchema->getModelType() === \TYPO3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY) { $this->persistenceSession->registerReconstitutedEntity($object, $objectData); } if ($objectData['properties'] === array()) { if (!$classSchema->isLazyLoadableObject()) { throw new \TYPO3\FLOW3\Persistence\Exception('The object of type "' . $className . '" is not marked as lazy loadable.', 1268309017); } $persistenceManager = $this->persistenceManager; $persistenceSession = $this->persistenceSession; $dataMapper = $this; $identifier = $objectData['identifier']; $modelType = $classSchema->getModelType(); $object->FLOW3_Persistence_LazyLoadingObject_thawProperties = function ($object) use($persistenceManager, $persistenceSession, $dataMapper, $identifier, $modelType) { $objectData = $persistenceManager->getObjectDataByIdentifier($identifier); $dataMapper->thawProperties($object, $identifier, $objectData); if ($modelType === \TYPO3\FLOW3\Reflection\ClassSchema::MODELTYPE_ENTITY) { $persistenceSession->registerReconstitutedEntity($object, $objectData); } }; } else { $this->thawProperties($object, $objectData['identifier'], $objectData); } return $object; } }