Change record status: 
Project: 
Introduced in branch: 
8.5.x
Introduced in version: 
8.5.0
Description: 

In 8.5.x the RevisionableInterface::wasDefaultRevision() method and a corresponding (revision metadata) field were added to revisionable entity types to track whether a revision was the default one when it was created. This is historical information and does not change over time:

  $revision1 = MyEntityType::create(['type' => 'test']);
  $revision1->save();
  $revision2 = clone $revision1;  
  $revision2->setNewRevision();
  $revision2->isDefaultRevision(FALSE);
  $revision2->save();
  $revision3 = clone $revision2;
  $revision3->setNewRevision();
  $revision3->isDefaultRevision(TRUE);
  $revision3->save();

  $storage = \Drupal::entityTypeManager()->getStorage($revision1->getEntityTypeId());
  $revision1 = $storage->loadRevision($revision1->getRevisionId());
  $default = $revision1->isDefaultRevision(); // $default is FALSE
  $default = $revision1->wasDefaultRevision(); // $default is TRUE
  $revision2 = $storage->loadRevision($revision2->getRevisionId());
  $default = $revision2->isDefaultRevision(); // $default is FALSE
  $default = $revision2->wasDefaultRevision(); // $default is FALSE
  $revision3 = $storage->loadRevision($revision3->getRevisionId());
  $default = $revision3->isDefaultRevision(); // $default is TRUE
  $default = $revision3->wasDefaultRevision(); // $default is TRUE

The corresponding field is added to every revisionable entity type and is defined via a revision_default revision metadata key, in the entity type definition, whose value defaults to revision_default. The field is installed automatically via system_update_8501, unless your entity type already defines a field with that name. In this case provide a different name via the revision metadata key and add an update function to install the new definition:


/**
 * Implements hook_entity_type_alter().
 */
function my_module_entity_type_alter(array &$entity_types) {
  /** @var EntityTypeInterface $entity_type */
  $entity_type = $entity_types['my_entity_type_id'];
  $keys = $entity_type->getKeys();
  // Actually this can be done directly in the entity type definition itself.
  $keys['revision_default'] = 'revision_default_core';
  $entity_type->set('entity_keys', $keys);
}

/**
 * Add the "revision_default_core" field to the "my_entity_type_id" entity type.
 */

/**
 * Add the "revision_default_core" field to the "my_entity_type_id" entity type.
 */
function my_module_update_8501() {
  // Clear the cached entity type definitions so we get the new
  // 'revision_default' revision metadata key.
  $entity_type_manager = \Drupal::entityTypeManager();
  $entity_type_manager->clearCachedDefinitions();

  $entity_type_id = 'my_entity_type_id';
  /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */
  $entity_type = $entity_type_manager->getDefinition($entity_type_id);
  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $field_name = $entity_type->getRevisionMetadataKey('revision_default');
  if ($definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id)) {
    return;
  }

  // Make sure the new "revision_default" revision metadata key is available
  // also to code using the latest installed definition.
  $installed_entity_type = $definition_update_manager->getEntityType($entity_type_id);
  $required_revision_metadata_keys = $installed_entity_type->get('requiredRevisionMetadataKeys');
  $required_revision_metadata_keys['revision_default'] = $field_name;
  $installed_entity_type->set('requiredRevisionMetadataKeys', $required_revision_metadata_keys);
  $revision_metadata_keys = $installed_entity_type->get('revision_metadata_keys');
  $revision_metadata_keys['revision_default'] = $required_revision_metadata_keys['revision_default'];
  $installed_entity_type->set('revision_metadata_keys', $revision_metadata_keys);
  $definition_update_manager->updateEntityType($installed_entity_type);

  // Install the new field.
  $storage_definition = BaseFieldDefinition::create('boolean')
    ->setLabel(t('Default revision'))
    ->setDescription(t('A flag indicating whether this was a default revision when it was saved.'))
    ->setStorageRequired(TRUE)
    ->setTranslatable(FALSE)
    ->setRevisionable(TRUE)
    // We cannot tell whether existing revisions were default or not when
    // they were created, but since we did not support creating non-default
    // revisions in any core stable UI so far, we default to TRUE.
    ->setInitialValue(TRUE);

  $definition_update_manager->installFieldStorageDefinition($field_name, $entity_type_id, 'my_module', $storage_definition);
}
Impacts: 
Module developers