Рейтинг:2

Не должен ли hook_update для добавления нового поля в сущность использовать определение поля из класса сущности?

флаг hk

Я писал хук обновления, чтобы добавить новое поле в настраиваемый объект, и следовал шаблону, показанному здесь.

https://www.drupal.org/node/2554097

/**
 * Добавлено поле «revision_translation_affected» к сущностям «node».
 */
функция node_update_8001() {
  // Устанавливаем определение, которое было у этого поля в
  // \Drupal\node\Entity\Node::baseFieldDefinitions()
  // во время написания этой функции обновления. Если/когда код
  // развернуто, что изменяет это определение, соответствующий модуль должен
  // реализуем функцию обновления, которая вызывает
  // \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition()
  // с новым определением.
  $storage_definition = BaseFieldDefinition::create('логическое значение')
      ->setLabel(t('Затронута редакция перевода'))
      ->setDescription(t('Указывает, относится ли последнее редактирование перевода к текущей редакции.'))
      -> установить только для чтения (ИСТИНА)
      ->setRevisionable(ИСТИНА)
      ->setTranslatable(ИСТИНА);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('revision_translation_affected', 'узел', 'узел', $storage_definition);
}

Я чувствовал, что дублирую BaseFieldDefinition как в пользовательском классе сущностей, так и в файле установки. Разве я не могу использовать статическую функцию

общедоступная статическая функция baseFieldDefinitions (EntityTypeInterface $entity_type) 

из класса сущности, чтобы загрузить определение поля и установить его?

No Sssweat avatar
флаг ua
Для исторических целей, я думаю, лучше этого не делать.
4uk4 avatar
флаг cn
Да, исторические в смысле ревизий кода. Обновление кода может содержать несколько изменений одновременно, в то время как хуки обновления должны обрабатывать изменения шаг за шагом.
флаг hk
Спасибо. Понятно.
Рейтинг:3
флаг us

Использование объекта, возвращаемого Drupal::entityDefinitionUpdateManager() это правильный способ обновить поля сущности по той же причине, что и hook_update_N() реализация не вызовет никаких крючок_схема() реализация для обновления поля базы данных.

Представьте, что позже вы измените сущность и переименуете это поле из ревизия_перевод_аффектед к translation_affected. Если хук обновления, который вы написали, теперь использует массив, возвращенный из baseFieldDefinitions() и сохраняет его в $поля, он не найдет никакого значения для поля['revision_translation_affected'], поскольку baseFieldDefinitions() уже был обновлен, чтобы вернуть переименованное поле.

Реализации хука обновления должны работать независимо от того, был ли он последним добавленным хуком обновления или нет.
Кроме того, код, используемый из хука обновления, не может быть изменен после того, как этот хук был добавлен. Если обработчик обновления создает поле сущности, которое впоследствии удаляется (например), необходимо добавить новую обработку обновления, чтобы удалить это поле сущности; существующий хук обновления нельзя изменить, чтобы больше не добавлять это поле сущности, или сайты, которые уже запускают этот хук обновления, не увидят, что поле сущности удалено. (Drupal запускает хук обновления только один раз.)

флаг hk
Спасибо за подробное объяснение @apaderno. Это имеет смысл.

Ответить или комментировать

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