Create.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\EntityManager\Operation;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Framework\DB\Adapter\DuplicateException;
  9. use Magento\Framework\EntityManager\Sequence\SequenceApplier;
  10. use Magento\Framework\EntityManager\Operation\Create\CreateMain;
  11. use Magento\Framework\EntityManager\Operation\Create\CreateAttributes;
  12. use Magento\Framework\EntityManager\Operation\Create\CreateExtensions;
  13. use Magento\Framework\EntityManager\MetadataPool;
  14. use Magento\Framework\EntityManager\EventManager;
  15. use Magento\Framework\EntityManager\TypeResolver;
  16. use Magento\Framework\App\ResourceConnection;
  17. use Magento\Framework\Exception\AlreadyExistsException;
  18. use Magento\Framework\Phrase;
  19. /**
  20. * Class Create
  21. *
  22. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  23. */
  24. class Create implements CreateInterface
  25. {
  26. /**
  27. * @var MetadataPool
  28. */
  29. private $metadataPool;
  30. /**
  31. * @var TypeResolver
  32. */
  33. private $typeResolver;
  34. /**
  35. * @var ResourceConnection
  36. */
  37. private $resourceConnection;
  38. /**
  39. * @var EventManager
  40. */
  41. private $eventManager;
  42. /**
  43. * @var CreateMain
  44. */
  45. private $createMain;
  46. /**
  47. * @var CreateAttributes
  48. */
  49. private $createAttributes;
  50. /**
  51. * @var CreateExtensions
  52. */
  53. private $createExtensions;
  54. /**
  55. * @var SequenceApplier
  56. */
  57. private $sequenceApplier;
  58. /**
  59. * @param MetadataPool $metadataPool
  60. * @param TypeResolver $typeResolver
  61. * @param ResourceConnection $resourceConnection
  62. * @param EventManager $eventManager
  63. * @param CreateMain $createMain
  64. * @param CreateAttributes $createAttributes
  65. * @param CreateExtensions $createExtensions
  66. */
  67. public function __construct(
  68. MetadataPool $metadataPool,
  69. TypeResolver $typeResolver,
  70. ResourceConnection $resourceConnection,
  71. EventManager $eventManager,
  72. CreateMain $createMain,
  73. CreateAttributes $createAttributes,
  74. CreateExtensions $createExtensions
  75. ) {
  76. $this->metadataPool = $metadataPool;
  77. $this->typeResolver = $typeResolver;
  78. $this->resourceConnection = $resourceConnection;
  79. $this->eventManager = $eventManager;
  80. $this->createMain = $createMain;
  81. $this->createAttributes = $createAttributes;
  82. $this->createExtensions = $createExtensions;
  83. }
  84. /**
  85. * @param object $entity
  86. * @param array $arguments
  87. * @return object
  88. * @throws \Exception
  89. * @throws AlreadyExistsException
  90. */
  91. public function execute($entity, $arguments = [])
  92. {
  93. $entityType = $this->typeResolver->resolve($entity);
  94. $metadata = $this->metadataPool->getMetadata($entityType);
  95. $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
  96. $connection->beginTransaction();
  97. try {
  98. $this->eventManager->dispatch(
  99. 'entity_manager_save_before',
  100. [
  101. 'entity_type' => $entityType,
  102. 'entity' => $entity
  103. ]
  104. );
  105. $this->eventManager->dispatchEntityEvent($entityType, 'save_before', ['entity' => $entity]);
  106. $entity = $this->getSequenceApplier()->apply($entity);
  107. $entity = $this->createMain->execute($entity, $arguments);
  108. $entity = $this->createAttributes->execute($entity, $arguments);
  109. $entity = $this->createExtensions->execute($entity, $arguments);
  110. $this->eventManager->dispatchEntityEvent($entityType, 'save_after', ['entity' => $entity]);
  111. $this->eventManager->dispatch(
  112. 'entity_manager_save_after',
  113. [
  114. 'entity_type' => $entityType,
  115. 'entity' => $entity
  116. ]
  117. );
  118. $connection->commit();
  119. } catch (DuplicateException $e) {
  120. $connection->rollBack();
  121. throw new AlreadyExistsException(new Phrase('Unique constraint violation found'), $e);
  122. } catch (\Exception $e) {
  123. $connection->rollBack();
  124. throw $e;
  125. }
  126. return $entity;
  127. }
  128. /**
  129. * @return SequenceApplier
  130. *
  131. * @deprecated 101.0.0
  132. */
  133. private function getSequenceApplier()
  134. {
  135. if (!$this->sequenceApplier) {
  136. $this->sequenceApplier = ObjectManager::getInstance()->get(
  137. SequenceApplier::class
  138. );
  139. }
  140. return $this->sequenceApplier;
  141. }
  142. }