CreateTable.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Setup\Declaration\Schema\Operations;
  7. use Magento\Framework\Setup\Declaration\Schema\Db\DbSchemaWriterInterface;
  8. use Magento\Framework\Setup\Declaration\Schema\Db\DDLTriggerInterface;
  9. use Magento\Framework\Setup\Declaration\Schema\Db\DefinitionAggregator;
  10. use Magento\Framework\Setup\Declaration\Schema\Db\Statement;
  11. use Magento\Framework\Setup\Declaration\Schema\Dto\Column;
  12. use Magento\Framework\Setup\Declaration\Schema\Dto\Constraint;
  13. use Magento\Framework\Setup\Declaration\Schema\Dto\ElementInterface;
  14. use Magento\Framework\Setup\Declaration\Schema\Dto\Index;
  15. use Magento\Framework\Setup\Declaration\Schema\Dto\Table;
  16. use Magento\Framework\Setup\Declaration\Schema\ElementHistory;
  17. use Magento\Framework\Setup\Declaration\Schema\ElementHistoryFactory;
  18. use Magento\Framework\Setup\Declaration\Schema\OperationInterface;
  19. /**
  20. * Create table operation.
  21. */
  22. class CreateTable implements OperationInterface
  23. {
  24. /**
  25. * Operation name.
  26. */
  27. const OPERATION_NAME = 'create_table';
  28. /**
  29. * @var DbSchemaWriterInterface
  30. */
  31. private $dbSchemaWriter;
  32. /**
  33. * @var DefinitionAggregator
  34. */
  35. private $definitionAggregator;
  36. /**
  37. * @var DDLTriggerInterface[]
  38. */
  39. private $columnTriggers;
  40. /**
  41. * @var DDLTriggerInterface[]
  42. */
  43. private $triggers;
  44. /**
  45. * @var ElementHistoryFactory
  46. */
  47. private $elementHistoryFactory;
  48. /**
  49. * @param DbSchemaWriterInterface $dbSchemaWriter
  50. * @param DefinitionAggregator $definitionAggregator
  51. * @param ElementHistoryFactory $elementHistoryFactory
  52. * @param array $columnTriggers
  53. * @param array $triggers
  54. */
  55. public function __construct(
  56. DbSchemaWriterInterface $dbSchemaWriter,
  57. DefinitionAggregator $definitionAggregator,
  58. ElementHistoryFactory $elementHistoryFactory,
  59. array $columnTriggers = [],
  60. array $triggers = []
  61. ) {
  62. $this->dbSchemaWriter = $dbSchemaWriter;
  63. $this->definitionAggregator = $definitionAggregator;
  64. $this->columnTriggers = $columnTriggers;
  65. $this->triggers = $triggers;
  66. $this->elementHistoryFactory = $elementHistoryFactory;
  67. }
  68. /**
  69. * {@inheritdoc}
  70. */
  71. public function getOperationName()
  72. {
  73. return self::OPERATION_NAME;
  74. }
  75. /**
  76. * {@inheritdoc}
  77. */
  78. public function isOperationDestructive()
  79. {
  80. return false;
  81. }
  82. /**
  83. * Setup callbacks for newely created columns
  84. *
  85. * @param array $columns
  86. * @param Statement $createTableStatement
  87. * @return void
  88. */
  89. private function setupColumnTriggers(array $columns, Statement $createTableStatement)
  90. {
  91. foreach ($columns as $column) {
  92. foreach ($this->columnTriggers as $trigger) {
  93. if ($trigger->isApplicable((string) $column->getOnCreate())) {
  94. $elementHistory = $this->elementHistoryFactory->create([
  95. 'new' => $column,
  96. 'old' => $column
  97. ]);
  98. $createTableStatement->addTrigger(
  99. $trigger->getCallback($elementHistory)
  100. );
  101. }
  102. }
  103. }
  104. }
  105. /**
  106. * Setup triggers for entire table
  107. *
  108. * @param Table $table
  109. * @param Statement $createTableStatement
  110. * @return void
  111. */
  112. private function setupTableTriggers(Table $table, Statement $createTableStatement)
  113. {
  114. foreach ($this->triggers as $trigger) {
  115. if ($trigger->isApplicable((string) $table->getOnCreate())) {
  116. $elementHistory = $this->elementHistoryFactory->create([
  117. 'new' => $table,
  118. 'old' => $table
  119. ]);
  120. $createTableStatement->addTrigger(
  121. $trigger->getCallback($elementHistory)
  122. );
  123. }
  124. }
  125. }
  126. /**
  127. * {@inheritdoc}
  128. */
  129. public function doOperation(ElementHistory $elementHistory)
  130. {
  131. /** @var Table $table */
  132. $table = $elementHistory->getNew();
  133. $definition = [];
  134. $data = [
  135. Column::TYPE => $table->getColumns(),
  136. Constraint::TYPE => $table->getConstraints(),
  137. Index::TYPE => $table->getIndexes()
  138. ];
  139. foreach ($data as $type => $elements) {
  140. /**
  141. * @var ElementInterface $element
  142. */
  143. foreach ($elements as $element) {
  144. //Make definition as flat list.
  145. $definition[$type . $element->getName()] = $this->definitionAggregator->toDefinition($element);
  146. }
  147. }
  148. $createTableStatement = $this->dbSchemaWriter
  149. ->createTable(
  150. $table->getName(),
  151. $elementHistory->getNew()->getResource(),
  152. $definition,
  153. $table->getDiffSensitiveParams()
  154. );
  155. $this->setupTableTriggers($table, $createTableStatement);
  156. $this->setupColumnTriggers($table->getColumns(), $createTableStatement);
  157. return [$createTableStatement];
  158. }
  159. }