Update.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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\DB\Adapter\DuplicateException;
  8. use Magento\Framework\EntityManager\Operation\Update\UpdateMain;
  9. use Magento\Framework\EntityManager\Operation\Update\UpdateAttributes;
  10. use Magento\Framework\EntityManager\Operation\Update\UpdateExtensions;
  11. use Magento\Framework\EntityManager\MetadataPool;
  12. use Magento\Framework\EntityManager\EventManager;
  13. use Magento\Framework\EntityManager\TypeResolver;
  14. use Magento\Framework\App\ResourceConnection;
  15. use Magento\Framework\Exception\AlreadyExistsException;
  16. use Magento\Framework\Phrase;
  17. /**
  18. * Class Update
  19. */
  20. class Update implements UpdateInterface
  21. {
  22. /**
  23. * @var MetadataPool
  24. */
  25. private $metadataPool;
  26. /**
  27. * @var TypeResolver
  28. */
  29. private $typeResolver;
  30. /**
  31. * @var ResourceConnection
  32. */
  33. private $resourceConnection;
  34. /**
  35. * @var EventManager
  36. */
  37. private $eventManager;
  38. /**
  39. * @var UpdateMain
  40. */
  41. private $updateMain;
  42. /**
  43. * @var UpdateAttributes
  44. */
  45. private $updateAttributes;
  46. /**
  47. * @var UpdateExtensions
  48. */
  49. private $updateExtensions;
  50. /**
  51. * @param MetadataPool $metadataPool
  52. * @param TypeResolver $typeResolver
  53. * @param ResourceConnection $resourceConnection
  54. * @param EventManager $eventManager
  55. * @param UpdateMain $updateMain
  56. * @param UpdateAttributes $updateAttributes
  57. * @param UpdateExtensions $updateExtensions
  58. */
  59. public function __construct(
  60. MetadataPool $metadataPool,
  61. TypeResolver $typeResolver,
  62. ResourceConnection $resourceConnection,
  63. EventManager $eventManager,
  64. UpdateMain $updateMain,
  65. UpdateAttributes $updateAttributes,
  66. UpdateExtensions $updateExtensions
  67. ) {
  68. $this->metadataPool = $metadataPool;
  69. $this->typeResolver = $typeResolver;
  70. $this->resourceConnection = $resourceConnection;
  71. $this->eventManager = $eventManager;
  72. $this->updateMain = $updateMain;
  73. $this->updateAttributes = $updateAttributes;
  74. $this->updateExtensions = $updateExtensions;
  75. }
  76. /**
  77. * @param object $entity
  78. * @param array $arguments
  79. * @return object
  80. * @throws \Exception
  81. */
  82. public function execute($entity, $arguments = [])
  83. {
  84. $entityType = $this->typeResolver->resolve($entity);
  85. $metadata = $this->metadataPool->getMetadata($entityType);
  86. $connection = $this->resourceConnection->getConnectionByName($metadata->getEntityConnectionName());
  87. $connection->beginTransaction();
  88. try {
  89. $this->eventManager->dispatch(
  90. 'entity_manager_save_before',
  91. [
  92. 'entity_type' => $entityType,
  93. 'entity' => $entity
  94. ]
  95. );
  96. $this->eventManager->dispatchEntityEvent($entityType, 'save_before', ['entity' => $entity]);
  97. $entity = $this->updateMain->execute($entity, $arguments);
  98. $entity = $this->updateAttributes->execute($entity, $arguments);
  99. $entity = $this->updateExtensions->execute($entity, $arguments);
  100. $this->eventManager->dispatchEntityEvent($entityType, 'save_after', ['entity' => $entity]);
  101. $this->eventManager->dispatch(
  102. 'entity_manager_save_after',
  103. [
  104. 'entity_type' => $entityType,
  105. 'entity' => $entity
  106. ]
  107. );
  108. $connection->commit();
  109. } catch (DuplicateException $e) {
  110. $connection->rollBack();
  111. throw new AlreadyExistsException(new Phrase('Unique constraint violation found'), $e);
  112. } catch (\Exception $e) {
  113. $connection->rollBack();
  114. throw $e;
  115. }
  116. return $entity;
  117. }
  118. }