dbSchemaWriter = $dbSchemaWriter; $this->definitionAggregator = $definitionAggregator; $this->columnTriggers = $columnTriggers; $this->triggers = $triggers; $this->elementHistoryFactory = $elementHistoryFactory; } /** * {@inheritdoc} */ public function getOperationName() { return self::OPERATION_NAME; } /** * {@inheritdoc} */ public function isOperationDestructive() { return false; } /** * Setup callbacks for newely created columns * * @param array $columns * @param Statement $createTableStatement * @return void */ private function setupColumnTriggers(array $columns, Statement $createTableStatement) { foreach ($columns as $column) { foreach ($this->columnTriggers as $trigger) { if ($trigger->isApplicable((string) $column->getOnCreate())) { $elementHistory = $this->elementHistoryFactory->create([ 'new' => $column, 'old' => $column ]); $createTableStatement->addTrigger( $trigger->getCallback($elementHistory) ); } } } } /** * Setup triggers for entire table * * @param Table $table * @param Statement $createTableStatement * @return void */ private function setupTableTriggers(Table $table, Statement $createTableStatement) { foreach ($this->triggers as $trigger) { if ($trigger->isApplicable((string) $table->getOnCreate())) { $elementHistory = $this->elementHistoryFactory->create([ 'new' => $table, 'old' => $table ]); $createTableStatement->addTrigger( $trigger->getCallback($elementHistory) ); } } } /** * {@inheritdoc} */ public function doOperation(ElementHistory $elementHistory) { /** @var Table $table */ $table = $elementHistory->getNew(); $definition = []; $data = [ Column::TYPE => $table->getColumns(), Constraint::TYPE => $table->getConstraints(), Index::TYPE => $table->getIndexes() ]; foreach ($data as $type => $elements) { /** * @var ElementInterface $element */ foreach ($elements as $element) { //Make definition as flat list. $definition[$type . $element->getName()] = $this->definitionAggregator->toDefinition($element); } } $createTableStatement = $this->dbSchemaWriter ->createTable( $table->getName(), $elementHistory->getNew()->getResource(), $definition, $table->getDiffSensitiveParams() ); $this->setupTableTriggers($table, $createTableStatement); $this->setupColumnTriggers($table->getColumns(), $createTableStatement); return [$createTableStatement]; } }