metadataPool = $metadataPool; $this->typeResolver = $typeResolver; $this->sequenceManager = $sequenceManager; $this->sequenceRegistry = $sequenceRegistry; $this->hydratorPool = $hydratorPool; } /** * Applies sequence identifier to given entity. * * In case sequence for given entity is not configured in corresponding di.xml file, * the entity will be returned without any changes. * * @param object $entity * * @return object */ public function apply($entity) { $entityType = $this->typeResolver->resolve($entity); /** @var \Magento\Framework\DB\Sequence\SequenceInterface|null $sequence */ $sequence = $this->sequenceRegistry->retrieve($entityType)['sequence']; if ($sequence) { $metadata = $this->metadataPool->getMetadata($entityType); $hydrator = $this->hydratorPool->getHydrator($entityType); $entityData = $hydrator->extract($entity); // Object already has identifier. if (isset($entityData[$metadata->getIdentifierField()]) && $entityData[$metadata->getIdentifierField()]) { $this->sequenceManager->force($entityType, $entityData[$metadata->getIdentifierField()]); } else { $entityData[$metadata->getIdentifierField()] = $sequence->getNextValue(); $entity = $hydrator->hydrate($entity, $entityData); } } return $entity; } }