Drupal → Отличие методов BaseFieldDefinition::setDefaultValue() и BaseFieldDefinition::setInitialValue()

05.05.2025

setDefaultValue()

Метод BaseFieldDefinition::setDefaultValue() вызывается в FieldableEntityInterface::baseFieldDefinitions() и содержит значение по умолчанию, которое будет отображаться в форме создания сущности. Пример:

class MyEnity extends ContentEntityBase {

  /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type): array {
    $fields = parent::baseFieldDefinitions($entity_type);

    $fields['author_name'] = BaseFieldDefinition::create('string')
      ->setLabel(new TM('Author name'))
      ->setDefaultValue('Guest') // <---
      ->setDisplayOptions('form', ['type' => 'string_textfield'])
      ->setDisplayOptions('view', ['type' => 'string']);

    return $fields;
  }

}

Если после включения модуля изменить значение в setDefaultValue(), то это никак не повлияет на уже добавленные сущности.

setInitialValue()

Метод BaseFieldDefinition::setInitialValue() вызывается в hook_update_N() при добавления поля к инсталлированному типу сущности и содержит значение, которое будет установлено всем уже существующим сущностям этого типа. Пример:

/**
 * Add author_name field to my_entity.
 */
function mymodule_update_11001(): void {
  $field_definition = BaseFieldDefinition::create('string')
    ->setLabel(new TM('Author name'))
    ->setDefaultValue('Guest') 
    ->setInitialValue('Guest') // <---
    ->setDisplayOptions('form', ['type' => 'string_textfield'])
    ->setDisplayOptions('view', ['type' => 'string']);
  \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition('author_name', 'my_entity', 'my_module', $field_definition);
}

Если отсюда убрать setInitialValue('Guest') то после запуска drush updb все существующие на данный момент сущности my_entity будут иметь пустое поле author_name.

Написанное актуально для
Drupal 8+
Похожие записи

Добавить комментарий