Какова цель создания обновлений сущностей?

14

После обновления модулей Drupal 8 меня предупредили на странице состояния Drupal 8, что:

Определения объекта / поля: В определениях типа объекта и полей были обнаружены следующие изменения.

После небольшого количества поисков в Google кажется, что решение этой проблемы - запустить drush entity-updates. Однако я нахожу это немного странным, так как кажется, что это еще одна команда, которую нужно запомнить или включить в рабочий процесс после обновления базы данных, не говоря уже о том, что сразу не было очевидно, как реагировать на исходное предупреждение.

Более того, часто бывает так, что в процессе разработки вы будете предупреждены о других действиях на странице статуса, что будет означать, что вы не будете сразу же знать, нужно ли вам это делать.

Кто-нибудь может объяснить, для чего это предупреждение - или, скорее, почему эта функция была введена в D8, и почему она не учитывается в операции обновления базы данных, а должна выполняться отдельно?

NJP
источник

Ответы:

19

drush entity-updatesэто инструмент разработчика. Если вы измените определения сущностей / полей в своем пользовательском модуле, вы можете быстро применить это.

На производстве такого не должно быть. Если вы обновляете модуль между официальными выпусками, то код обновления в модуле должен справиться с этим.

Но в вашем случае вы упоминаете, что ваш сайт находится в разработке. Так что есть много вещей, которые могли бы вызвать это. Либо в вашем собственном коде, либо в dev или альфа-версиях модулей contrib.

Я нашел этот пример в функциях обновления CR Write для обновлений схемы объекта, удалена автоматизация (там, где есть дополнительные примеры):

/**
 * Add 'revision_translation_affected' field to 'node' entities.
 */
function node_update_8001() {
  // Install the definition that this field had in
  // \Drupal\node\Entity\Node::baseFieldDefinitions()
  // at the time that this update function was written. If/when code is
  // deployed that changes that definition, the corresponding module must
  // implement an update function that invokes
  // \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition()
  // with the new definition.
  $storage_definition = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Revision translation affected'))
      ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
      ->setReadOnly(TRUE)
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('revision_translation_affected', 'node', 'node', $storage_definition);
}
4k4
источник
2
За исключением того, что это на самом деле плохой пример. если вы являетесь модулем, вы должны делать очень конкретные обновления. Установите новое определение поля, обновите определение типа объекта. Это может пойти очень плохо, если вы обновите несколько модулей или если модуль внесет другое изменение в будущем, и вы обновите старую версию. У node.install есть несколько лучших примеров обновления.
Бердир
1
Первоначально это было сделано автоматически как часть файла updb / update.php. Но это не всегда работает, оно не поддерживает возможно разрушительные обновления, когда есть данные, и это вызвало много проблем. Если у вас есть данные в поле, вы не можете просто вызвать этот метод, вам нужно обновить его самостоятельно, что может быть довольно сложно. См. Drupal.org/node/2554097 для получения дополнительной информации
Бердир
2
Примечание относительно комментария Бердира: я удалил плохой пример и заменил его одним из записи изменений.
Энди
2
Просто чтобы быть понятным, причина того, что запускать обновления сущностей в производстве - плохая идея, заключается в том, что это может быть разрушительным. Например, если вы измените uuid хранилища полей, импортируете измененное определение хранилища, запустите cron, а затем запустите обновление сущностей, оно уничтожит любой существующий контент в этом поле.
Дейн Пауэлл,
2
Модули должны нести ответственность за применение своих собственных обновлений схемы через целевые ловушки обновлений. Никто не должен запускать entity-updatesкоманду на регулярной основе, кроме как на ранних этапах процесса разработки сайтов с пользовательскими модулями, где вас не волнует уничтожение данных.
Дейн Пауэлл,
1

Команда "drush entity-updates" была удалена из v 8.7.0

См. Https://www.drupal.org/node/3034742.

Начиная с 8.7.0, ядро ​​Drupal больше не поддерживает автоматические обновления сущностей. Всякий раз, когда необходимо создать, изменить или удалить определение типа объекта или хранилища полей, оно должно быть выполнено с помощью явной функции обновления, предоставляемой API обновления, и с использованием API, предоставляемого менеджером обновлений определения объекта.

Andriyun
источник