diff --git a/core/modules/system/src/EntitySchemaUpdater.php b/core/modules/system/src/EntitySchemaUpdater.php index 292edac..1fc6ba6 100644 --- a/core/modules/system/src/EntitySchemaUpdater.php +++ b/core/modules/system/src/EntitySchemaUpdater.php @@ -3,33 +3,88 @@ namespace Drupal\system; +use Drupal\Core\Database\Connection; +use Drupal\Core\Entity\EntityDefinitionUpdateManagerInterface; +use Drupal\Core\Entity\EntityFieldManagerInterface; +use Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface; use Drupal\Core\Entity\EntityTypeInterface; -use Drupal\Core\Entity\RevisionLogInterface; -use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema; -use Drupal\Core\Entity\Sql\SqlEntityStorageInterface; +use Drupal\Core\Entity\EntityTypeListenerInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\StringTranslation\TranslatableMarkup; class EntitySchemaUpdater implements EntitySchemaUpdaterInterface { /** + * @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface + */ + protected $lastInstalledSchemaRepository; + + /** + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * @var \Drupal\Core\Entity\EntityDefinitionUpdateManagerInterface + */ + protected $entityDefinitionUpdateManager; + + /** + * @var \Drupal\Core\Entity\EntityFieldManagerInterface + */ + protected $entityFieldManager; + + /** + * @var \Drupal\Core\Database\Connection + */ + protected $database; + + /** + * EntitySchemaUpdater constructor. + */ + public function __construct(EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository, EntityTypeManagerInterface $entity_type_manager, EntityDefinitionUpdateManagerInterface $entity_definition_update_manager, EntityFieldManagerInterface $entity_field_manager, Connection $database) { + $this->lastInstalledSchemaRepository = $last_installed_schema_repository; + $this->entityTypeManager = $entity_type_manager; + $this->entityDefinitionUpdateManager = $entity_definition_update_manager; + $this->entityFieldManager = $entity_field_manager; + $this->database = $database; + } + + /** + * {@inheritdoc} + */ + public function updateEntityType(EntityTypeInterface $entity_type) { + $last_entity_type = $this->lastInstalledSchemaRepository->getLastInstalledDefinition($entity_type->id()); + $keys = $last_entity_type->getKeys(); + $keys['revision'] = 'revision_id'; + $last_entity_type->set('entity_keys', $keys); + $last_entity_type->set('revision_table', $entity_type->getRevisionTable()); + $last_entity_type->set('revision_data_table', $entity_type->getRevisionDataTable()); + $this->lastInstalledSchemaRepository->setLastInstalledDefinition($last_entity_type); + } + + /** * {@inheritdoc} */ public function createTables(EntityTypeInterface $entity_type) { - $entity_type_manager = \Drupal::entityTypeManager(); - $storage = $entity_type_manager->getStorage($entity_type->id()); - if ($storage instanceof SqlEntityStorageInterface) { + /** @var \Drupal\Core\Entity\EntityTypeListenerInterface $storage */ + $storage = $this->entityTypeManager->getStorage($entity_type->id()); + if ($storage instanceof EntityTypeListenerInterface) { $storage->onEntityTypeCreate($entity_type); } } + /** + * {@inheritdoc} + */ public function installFields(EntityTypeInterface $entity_type) { if ($entity_type->hasKey('revision')) { $revision_id = BaseFieldDefinition::create('integer') ->setLabel(new TranslatableMarkup('Revision ID')) ->setReadOnly(TRUE) ->setSetting('unsigned', TRUE); - \Drupal::entityDefinitionUpdateManager() + $this->entityDefinitionUpdateManager ->installFieldStorageDefinition($entity_type->getKey('revision'), $entity_type->id(), $entity_type->id(), $revision_id); } @@ -38,7 +93,7 @@ public function installFields(EntityTypeInterface $entity_type) { ->setLabel(t('Revision create time')) ->setDescription(t('The time that the current revision was created.')) ->setRevisionable(TRUE); - \Drupal::entityDefinitionUpdateManager() + $this->entityDefinitionUpdateManager ->installFieldStorageDefinition("revision_created", $entity_type->id(), $entity_type->id(), $revision_created); $revision_user = BaseFieldDefinition::create('entity_reference') @@ -46,7 +101,7 @@ public function installFields(EntityTypeInterface $entity_type) { ->setDescription(t('The user ID of the author of the current revision.')) ->setSetting('target_type', 'user') ->setRevisionable(TRUE); - \Drupal::entityDefinitionUpdateManager() + $this->entityDefinitionUpdateManager ->installFieldStorageDefinition("revision_user", $entity_type->id(), $entity_type->id(), $revision_user); $revision_log_message = BaseFieldDefinition::create('string_long') @@ -61,41 +116,32 @@ public function installFields(EntityTypeInterface $entity_type) { 'rows' => 4, ], ]); - \Drupal::entityDefinitionUpdateManager() + $this->entityDefinitionUpdateManager ->installFieldStorageDefinition("revision_log_message", $entity_type->id(), $entity_type->id(), $revision_log_message); /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $field_definitions */ - $field_definitions = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($entity_type->id()); + $field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type->id()); foreach ($field_definitions as $field_definition) { - \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition($field_definition); + $this->entityDefinitionUpdateManager->updateFieldStorageDefinition($field_definition); } $revision_data_table = $entity_type->getRevisionDataTable(); - $schema = \Drupal::database()->schema(); + $schema = $this->database->schema(); $schema->dropPrimaryKey($revision_data_table); $schema->addPrimaryKey($revision_data_table, [$entity_type->getKey('revision'), $entity_type->getKey('langcode')]); } - public function updateEntityType(EntityTypeInterface $entity_type) { - /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */ - $last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository'); - $last_entity_type = $last_installed_schema_repository->getLastInstalledDefinition($entity_type->id()); - $keys = $last_entity_type->getKeys(); - $keys['revision'] = 'revision_id'; - $last_entity_type->set('entity_keys', $keys); - $last_entity_type->set('revision_table', $entity_type->getRevisionTable()); - $last_entity_type->set('revision_data_table', $entity_type->getRevisionDataTable()); - $last_installed_schema_repository->setLastInstalledDefinition($last_entity_type); - } - + /** + * {@inheritdoc} + */ public function copyData(EntityTypeInterface $entity_type) { /** @var \Drupal\Core\Entity\Sql\TableMappingInterface $table_mapping */ - $table_mapping = \Drupal::entityTypeManager()->getStorage($entity_type->id())->getTableMapping(); + $table_mapping = $this->entityTypeManager->getStorage($entity_type->id())->getTableMapping(); $table_names = $table_mapping->getTableNames(); $data = []; foreach ($table_names as $table_name) { $column_names = $table_mapping->getAllColumns($table_name); - $results = \Drupal::database()->select($table_name, 't')->fields('t')->execute()->fetchAll(); + $results = $this->database->select($table_name, 't')->fields('t')->execute()->fetchAll(); foreach ($results as $key => $result) { foreach ($column_names as $column_name) { if (!empty($result->{$column_name})) { @@ -119,17 +165,17 @@ public function copyData(EntityTypeInterface $entity_type) { $values[$column_name] = $record[$column_name]; } } - $query = \Drupal::database()->select($table_name)->fields($table_name, [$id])->condition($id, $record[$id]); + $query = $this->database->select($table_name)->fields($table_name, [$id])->condition($id, $record[$id]); $exists = $query->execute()->fetchAll(); if (isset($exists) && isset($exists[0]) && ($exists[0]->{$id} == $record[$id])) { - \Drupal::database() + $this->database ->update($table_name) ->fields($values) ->condition($id, $record[$id]) ->execute(); } else { - \Drupal::database() + $this->database ->insert($table_name) ->fields($values) ->execute(); diff --git a/core/modules/system/src/EntitySchemaUpdaterInterface.php b/core/modules/system/src/EntitySchemaUpdaterInterface.php index af6c6aa..0175528 100644 --- a/core/modules/system/src/EntitySchemaUpdaterInterface.php +++ b/core/modules/system/src/EntitySchemaUpdaterInterface.php @@ -7,18 +7,31 @@ interface EntitySchemaUpdaterInterface { /** + * Updates installed entity type definition. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + */ + public function updateEntityType(EntityTypeInterface $entity_type); + + /** + * Creates missing tables. + * * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type */ public function createTables(EntityTypeInterface $entity_type); /** + * Installs new fields. + * * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type */ public function installFields(EntityTypeInterface $entity_type); /** + * Copies existing data to new tables. + * * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type */ - public function updateEntityType(EntityTypeInterface $entity_type); + public function copyData(EntityTypeInterface $entity_type); } diff --git a/core/modules/system/system.services.yml b/core/modules/system/system.services.yml index 739564b..93ac9a8 100644 --- a/core/modules/system/system.services.yml +++ b/core/modules/system/system.services.yml @@ -45,4 +45,4 @@ services: - { name: event_subscriber } system.entity_schema_updater: class: Drupal\system\EntitySchemaUpdater - arguments: [] + arguments: ['@entity.last_installed_schema.repository', '@entity_type.manager', '@entity.definition_update_manager', '@entity_field.manager', '@database']