Почему вывод из getDefinition($type) отличается от getstorage($type)->getentitytype()?


В Controller при вызове: $this->entityTypeManager()->getStorage($type)->getEntityType() у меня нет точно такого же возвращаемого значения, как: $this->entityTypeManager()->getDefinition($type).

Они оба возвращают один и тот же класс (в моих тестах это был ContentEntityType), но единственное различие заключается в определении entity_keys. Вот разница в экспорте var, подчеркивающая разницу между двумя вызовами:

--- a/fromStorage.txt
+++ b/fromStorage.txt
@@ -19,6 +19,7 @@ Drupal\Core\Entity\ContentEntityType::__set_state(array(
     'uuid' => 'uuid',
     'langcode' => 'langcode',
     'published' => 'status',
+    'test' => 'entity_key_value',
     'revision' => '',
     'bundle' => '',
     'default_langcode' => 'default_langcode',

Ключ сущности test был добавлен после установки модуля (пользовательская сущность). Только вызов $this->entityTypeManager()->getDefinition($type) возвращает этот ключ сущности. Оставшаяся часть определения сущности является на 100 % то же самое.

Сначала я подумал, что необходимо обновление сущности, но диспетчер обновлений сущности не обнаруживает обновления для применения. Очистка тайников тоже не помогла. Почему такая непоследовательность? Я где-то пропустил звонок с обновлением?

Author: Dakwamine, 2020-07-28

1 answers

Покопавшись во внутренних элементах управления типом сущности/хранилищем, я вполне уверен, что нашел ответ: $this->entityTypeManager()->getStorage($type)->getEntityType() использует результат EntityManager::getActiveDefinition который загружает своего рода кэшированное представление типа сущности. Это было введено https://www.drupal.org/project/drupal/issues/2554235 в котором добавлена концепция последнего установленного определения, предназначенная для устранения проблем во время процессов обновления.

Разница между кодовой базой и база данных означает, что сущности может потребоваться обновление, например, следующее:

$codefieldstoragedef = $this->entityTypeManager->getDefinition($this->entityType->id());
\Drupal::entityDefinitionUpdateManager()->updateEntityType($codefieldstoragedef);

Поскольку $this->entityTypeManager->getDefinition() возвращает представление кодовой базы, это подскажет Drupal обновить представление базы данных с его помощью. После этого (предпочтительно в обновлении крючка) ключи сущностей будут совпадать.


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

 2
Author: Dakwamine, 2020-10-26 10:51:04