diff --git a/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php b/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php index 886fd97..59744b6 100644 --- a/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php +++ b/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php @@ -32,25 +32,6 @@ public function __construct(StateInterface $state) { public function getFieldDefinitions($field_storage_unique_id = NULL) { $deleted_field_definitions = $this->state->get('field.field.deleted', []); - $deleted_storage_definitions = $this->getFieldStorageDefinitions(); - /** @var \Drupal\Core\Field\FieldDefinitionInterface $field_definition */ - foreach ($deleted_field_definitions as $id => $field_definition) { - // Configurable fields have an internal reference to their field storage - // which we must keep in sync if the storage itself is also deleted. - if ($field_definition instanceof FieldConfigBase && isset($deleted_storage_definitions[$field_definition->field_storage_unique_id])) { - $config = $field_definition->toArray(); - $config['deleted'] = TRUE; - $config['field_storage'] = $deleted_storage_definitions[$field_definition->field_storage_unique_id]; - $updated_field_definition = get_class($field_definition)::create($config); - - // Re-assign the 'field_storage_unique_id' property since it was lost - // above while re-initializing the configurable field object. - $updated_field_definition->field_storage_unique_id = $field_definition->field_storage_unique_id; - - $deleted_field_definitions[$id] = $updated_field_definition; - } - } - if ($field_storage_unique_id) { $deleted_field_definitions = array_filter($deleted_field_definitions, function (FieldDefinitionInterface $field_definition) use ($field_storage_unique_id) { return $field_definition->getFieldStorageDefinition()->getUniqueStorageIdentifier() === $field_storage_unique_id; @@ -72,11 +53,6 @@ public function getFieldStorageDefinitions() { */ public function addFieldDefinition(FieldDefinitionInterface $field_definition) { $deleted_field_definitions = $this->state->get('field.field.deleted', []); - - // Add a helper property that allows us to filter by the field storage - // unique identifier in getFieldDefinitions(). - $field_definition->field_storage_unique_id = $field_definition->getFieldStorageDefinition()->getUniqueStorageIdentifier(); - $deleted_field_definitions[$field_definition->getUniqueIdentifier()] = $field_definition; $this->state->set('field.field.deleted', $deleted_field_definitions); diff --git a/core/modules/field/src/Entity/FieldConfig.php b/core/modules/field/src/Entity/FieldConfig.php index d8b4332..0ab9408 100644 --- a/core/modules/field/src/Entity/FieldConfig.php +++ b/core/modules/field/src/Entity/FieldConfig.php @@ -205,6 +205,7 @@ public static function preDelete(EntityStorageInterface $storage, array $fields) if (!$field->deleted && $target_entity_storage instanceof FieldableEntityStorageInterface && $target_entity_storage->countFieldData($field->getFieldStorageDefinition(), TRUE)) { $field = clone $field; $field->deleted = TRUE; + $field->fieldStorage = NULL; $deleted_fields_repository->addFieldDefinition($field); } } @@ -286,14 +287,30 @@ public function isDeleted() { */ public function getFieldStorageDefinition() { if (!$this->fieldStorage) { - $fields = $this->entityManager()->getFieldStorageDefinitions($this->entity_type); - if (!isset($fields[$this->field_name])) { + $field_storage_definition = NULL; + + $field_storage_definitions = $this->entityManager()->getFieldStorageDefinitions($this->entity_type); + if (isset($field_storage_definitions[$this->field_name])) { + $field_storage_definition = $field_storage_definitions[$this->field_name]; + } + // If this field has been deleted, try to find its field storage + // definition in the deleted fields repository. + elseif ($this->deleted) { + $deleted_storage_definitions = \Drupal::service('field.deleted_fields_repository')->getFieldStorageDefinitions(); + foreach ($deleted_storage_definitions as $deleted_storage_definition) { + if ($deleted_storage_definition->getName() === $this->field_name) { + $field_storage_definition = $deleted_storage_definition; + } + } + } + + if (!$field_storage_definition) { throw new FieldException("Attempt to create a field {$this->field_name} that does not exist on entity type {$this->entity_type}."); } - if (!$fields[$this->field_name] instanceof FieldStorageConfigInterface) { + if (!$field_storage_definition instanceof FieldStorageConfigInterface) { throw new FieldException("Attempt to create a configurable field of non-configurable field storage {$this->field_name}."); } - $this->fieldStorage = $fields[$this->field_name]; + $this->fieldStorage = $field_storage_definition; } return $this->fieldStorage;