SequenceApplier.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\EntityManager\Sequence;
  7. /**
  8. * Applier of sequence identifier.
  9. */
  10. class SequenceApplier
  11. {
  12. /**
  13. * @var \Magento\Framework\EntityManager\MetadataPool
  14. */
  15. private $metadataPool;
  16. /**
  17. * @var \Magento\Framework\EntityManager\TypeResolver
  18. */
  19. private $typeResolver;
  20. /**
  21. * @var \Magento\Framework\EntityManager\Sequence\SequenceManager
  22. */
  23. private $sequenceManager;
  24. /**
  25. * @var \Magento\Framework\EntityManager\Sequence\SequenceRegistry
  26. */
  27. private $sequenceRegistry;
  28. /**
  29. * @var \Magento\Framework\EntityManager\HydratorPool
  30. */
  31. private $hydratorPool;
  32. /**
  33. * @param \Magento\Framework\EntityManager\MetadataPool $metadataPool
  34. * @param \Magento\Framework\EntityManager\TypeResolver $typeResolver
  35. * @param \Magento\Framework\EntityManager\Sequence\SequenceManager $sequenceManager
  36. * @param \Magento\Framework\EntityManager\Sequence\SequenceRegistry $sequenceRegistry
  37. * @param \Magento\Framework\EntityManager\HydratorPool $hydratorPool
  38. */
  39. public function __construct(
  40. \Magento\Framework\EntityManager\MetadataPool $metadataPool,
  41. \Magento\Framework\EntityManager\TypeResolver $typeResolver,
  42. \Magento\Framework\EntityManager\Sequence\SequenceManager $sequenceManager,
  43. \Magento\Framework\EntityManager\Sequence\SequenceRegistry $sequenceRegistry,
  44. \Magento\Framework\EntityManager\HydratorPool $hydratorPool
  45. ) {
  46. $this->metadataPool = $metadataPool;
  47. $this->typeResolver = $typeResolver;
  48. $this->sequenceManager = $sequenceManager;
  49. $this->sequenceRegistry = $sequenceRegistry;
  50. $this->hydratorPool = $hydratorPool;
  51. }
  52. /**
  53. * Applies sequence identifier to given entity.
  54. *
  55. * In case sequence for given entity is not configured in corresponding di.xml file,
  56. * the entity will be returned without any changes.
  57. *
  58. * @param object $entity
  59. *
  60. * @return object
  61. */
  62. public function apply($entity)
  63. {
  64. $entityType = $this->typeResolver->resolve($entity);
  65. /** @var \Magento\Framework\DB\Sequence\SequenceInterface|null $sequence */
  66. $sequence = $this->sequenceRegistry->retrieve($entityType)['sequence'];
  67. if ($sequence) {
  68. $metadata = $this->metadataPool->getMetadata($entityType);
  69. $hydrator = $this->hydratorPool->getHydrator($entityType);
  70. $entityData = $hydrator->extract($entity);
  71. // Object already has identifier.
  72. if (isset($entityData[$metadata->getIdentifierField()]) && $entityData[$metadata->getIdentifierField()]) {
  73. $this->sequenceManager->force($entityType, $entityData[$metadata->getIdentifierField()]);
  74. } else {
  75. $entityData[$metadata->getIdentifierField()] = $sequence->getNextValue();
  76. $entity = $hydrator->hydrate($entity, $entityData);
  77. }
  78. }
  79. return $entity;
  80. }
  81. }