Почему вывод из 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 % то же самое.
Сначала я подумал, что необходимо обновление сущности, но диспетчер обновлений сущности не обнаруживает обновления для применения. Очистка тайников тоже не помогла. Почему такая непоследовательность? Я где-то пропустил звонок с обновлением?
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 обновить представление базы данных с его помощью. После этого (предпочтительно в обновлении крючка) ключи сущностей будут совпадать.
Этот ответ также предназначен для устранения некоторого несоответствия определения сущности, как показано на странице отчета о состоянии, особенно в отношении базовых полей для обновления, которые используются в качестве ключей сущности.